I'm in the process of migrating the common libraries I used during my university years to github. They were the building blocks for larger implementations, like bplus trees, static hashing, etc.<p>I haven't really coded in C since then, so when I looked at the source code after all those years I found a large number of bad practices and I'm slowly working towards fixing.<p>My question is - is there any guide towards organizing large C codebases that provides info like:<p>- How to name header guards?
- How to name variables used for the same purpose for consistency?
- How to name globals?
- How to name the API functions?
etc
Divide the code into modules which are as independent of each other as reasonably possible and thus can be reasoned about in isolation.<p>From the above follows that the modules do not hold global state and communicate with each other through well-defined interfaces - and not through global state.<p>Unfortunately C does not have an actual module system but only the "unit of translation" concept. In general you want two files per module e.g. my_module.c and my_module.h and prefix everything in there with my_module to avoid namespace conflicts e.g. my_module_new_foo(), my_module_update_foo(foo, MY_MODULE_FLAG | MY_MODULE_OTHER_FLAG)<p>EDIT: Note that the standard scheme to avoid holding global state in a module is that the module provides a function which allocates an "instance" of the module and all module functions work on such "instances" e.g.<p><pre><code> RNG_INSTANCE* r = rng_new();
double v = rng_uniform(r);
...
rng_free(r);</code></pre>
By the way, a friend suggested this guide, which is really interesting -> <a href="https://matt.sh/howto-c" rel="nofollow">https://matt.sh/howto-c</a>