预处理器#ifndef

Posted

技术标签:

【中文标题】预处理器#ifndef【英文标题】:Preprocessor #ifndef 【发布时间】:2012-03-13 18:51:32 【问题描述】:

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

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

假设我也有b.h,其中还包括&lt;stdbool.h&gt;。如果a.h 中有#ifndef 预处理器定义语句而b.h 没有。 a.h 是否只包含b.h 中未包含的内容?所以当b.h包含a.h时,a.h会包含stddef.hstein.h而不是重新包含stdbool.h还是那些预处理器定义函数只用于查看整个类是否被重新定义,而不是特定的里面的功能?

编辑:

另外,假设b.h 包含另一个包含stdbool.h 的头文件 - 这使得b.h 具有来自该类和a.hstdbool.h。这会导致错误吗?

【问题讨论】:

【参考方案1】:

必须使所有 C 标准头文件可以被多次包含并以任意顺序包含:

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

【讨论】:

【参考方案2】:

如果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();

【讨论】:

一旦您从多个文件中使用相同的标题,标题中的定义无论如何都会导致链接错误,所以不要这样做。【参考方案3】:

大部分header开头都是正常的

#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_

并以以下行结束:

#endif

如果您包含两次标头,由于#ifndef#define#endif,您的程序第二次将不再包含完整的标头

【讨论】:

以上是关于预处理器#ifndef的主要内容,如果未能解决你的问题,请参考以下文章

可以在 #ifndef ... #endif 等预处理器指令块中的 VS2008 中启用智能感知吗

笔记2:预处理器-预处理指令

小白学习C++ 教程十四C++ 中预处理器

#define 预处理器指令可以包含 if 和 else 吗?

是否有用于 Octave 和 Scilab 的 C 类预处理器指令用于互兼容代码?

WebGL-Shader入门(6.着色器语言GLSL ES 预处理指令和宏定义)