I have a C project where all code is organized in *.c/*.h file pairs, and I need to define a constant value in one file, which will be however also be used in other files. How should I declare and define this value?
Should it be as static const ... in the *.h file? As extern const ... in the *.h file and defined in the *.c file? In what way does it matter if the value is not a primitive datatype (int, double, etc), but a char * or a struct? (Though in my case it is a double.)
Defining stuff inside *.h files doesn’t seem like a good idea generally; one should declare things in the *.h file, but define them in the *.c file. However, the extern const ... approach seems inefficient, as the compiler wouldn’t be able to inline the value, it instead having to be accessed via its address all the time.
I guess the essence of this question is: Should one define static const ... values in *.h files in C, in order to use them in more that one place?
The rule I follow is to only declare things in H files and define them in C files. You can declare and define in a single C file, assuming it will only be used in that file.
By declaration, I mean notify the compiler of its existence but don’t allocate space for it. This includes
#define,typedef,extern int x, and so on.Definitions assign values to declarations and allocate space for them, such as
int xandconst int x. This includes function definitions; including these in header files frequently lead to wasted code space.I’ve seen too many junior programmers get confused when they put
const int x = 7;in a header file and then wonder why they get a link error forxbeing defined more than once. I think at a bare minimum, you would needstatic const int xso as to avoid this problem.I wouldn’t be too worried about the speed of the code. The main issue with computers (in terms of speed and cost) long ago shifted from execution speed to ease of development.