简体   繁体   中英

Preprocessor #ifndef

Assume I have ah which includes the following:

<stdbool.h>
<stddef.h>
<stdin.h>

Assume I also have bh which also includes <stdbool.h> . If ah has the #ifndef preprocessor definition statement in it and bh doesn't. Will ah include only what hasn't been included in bh ? So when bh includes ah , will ah 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 bh includes another header file which includes stdbool.h -that makes bh have stdbool.h both from that class and ah . Will that cause errors?

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();
}

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM