预处理器#ifndef
Posted
技术标签:
【中文标题】预处理器#ifndef【英文标题】:Preprocessor #ifndef 【发布时间】:2012-03-13 18:51:32 【问题描述】:假设我有a.h
,其中包括以下内容:
<stdbool.h>
<stddef.h>
<stdin.h>
假设我也有b.h
,其中还包括<stdbool.h>
。如果a.h
中有#ifndef
预处理器定义语句而b.h
没有。 a.h
是否只包含b.h
中未包含的内容?所以当b.h
包含a.h
时,a.h
会包含stddef.h
和stein.h
而不是重新包含stdbool.h
还是那些预处理器定义函数只用于查看整个类是否被重新定义,而不是特定的里面的功能?
编辑:
另外,假设b.h
包含另一个包含stdbool.h
的头文件 - 这使得b.h
具有来自该类和a.h
的stdbool.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 中启用智能感知吗
#define 预处理器指令可以包含 if 和 else 吗?