问题
Assume I have a.h which includes the following:
<stdbool.h>
<stddef.h>
<stdin.h>
Assume I also have b.h which also includes <stdbool.h>. If a.h has the #ifndef preprocessor definition statement in it and b.h doesn't. Will a.h include only what hasn't been included in b.h? So when b.h includes a.h, will a.h include stddef.h and stein.h and not re-include stdbool.h or are those preprocessor definition functions only used to see whether this whole class is redefined, and not specific functions within it?
EDIT:
Also, assume b.h includes another header file which includes stdbool.h -that makes b.h have stdbool.h both from that class and a.h. Will that cause errors?
回答1:
All C standard headers must be made such that they can be included several times and in any order:
Standard headers may be included in any order; each may be included more than once in a given scope, with no effect different from being included only once
回答2:
If stdbool.h itself has include guards (#ifndef) then everything will be fine. Otherwise you may indeed end up including some headers twice. Will it cause a problem? It depends. If the twice-included header contains only declarations then everything will compile - it will just take few nanoseconds longer. Imagine this:
int the_answer(void); // <-- from first inclusion
int the_answer(void); // <-- from from second inclusion - this is OK
// at least as long as declarations are the same
int main()
{
return the_answer();
}
If on the other hand there will be definitions it will cause an error:
int the_answer(void) // <-- from first inclusion - OK so far
{
return 42;
}
int the_answer(void) // <-- from second inclusion
{ // error: redefinition of 'the_answer'
return 42;
}
int main()
{
return the_answer();
}
回答3:
It's normal that most header start with
#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_
and end with the following line:
#endif
If you include a header two times, the second time your programm won't include the full header again because of the #ifndef, #define and #endif
来源:https://stackoverflow.com/questions/9690212/preprocessor-ifndef