Preprocessor #ifndef

北慕城南 提交于 2019-12-01 12:53:24

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!