预处理器#ifndef

时间:2012-03-13 18:51:32

标签: c header-files ifndef

假设我有a.h,其中包括以下内容:

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

假设我还有b.h,其中还包含<stdbool.h>。如果a.h中包含#ifndef预处理程序定义语句而b.h没有。a.hb.h仅会包含b.h中未包含的内容吗?因此,当a.h包含a.h时,stddef.h将包含stein.hstdbool.h而不会重新包含b.h,或者仅使用预处理器定义函数看看整个班级是否被重新定义,而不是其中的特定功能?

编辑:

此外,假设stdbool.h包含另一个头文件,其中包含b.h - 使stdbool.h具有a.h来自该类和{{1}}。这会导致错误吗?

3 个答案:

答案 0 :(得分:1)

如果stdbool.h本身包含警卫(#ifndef),那么一切都会好的。否则你可能最终会包含两次标题。它会引起问题吗?这取决于。如果两次包含的头只包含声明,则所有内容都将编译 - 它只需要几纳秒的时间。想象一下:

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

如果另一方面会有定义,则会导致错误:

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

答案 1 :(得分:1)

必须制作所有C标准标题,以便它们可以按任何顺序包含多次:

  

标准标题可以包含在任何顺序中;每个都可以包括在内   在给定范围内不止一次,没有效果   只包括一次

答案 2 :(得分:0)

大多数标头以

开头是正常的
#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_

并以以下行结束:

#endif

如果您包含标题两次,则由于#ifndef#define#endif

,您的程序第二次不再包含完整标题