Are there any known design principles, best-practices and design patterns that one can follow while designing a C project? Or useful design principles for procedural (imperative) programming in general?
(I'm child of the 'object-oriented generation' and have to design a large C project for the first time)
Information hiding - as espoused by Parnas (Software Fundamentals).
Careful management of headers and visibility:
The header is self-protected - so it does not matter if it is included multiple times.
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...rest of header contents, including other #include lines if necessary
#endif /* HEADER_H_INCLUDED */
Design sets of functions to work on 'objects' (usually structures) - and use those functions rather than poking around the innards of the structure in the code that is using it. Think of it as self-imposed encapsulation.