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 x
and const 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 for x
being defined more than once. I think at a bare minimum, you would need static const int x
so 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.