C 预处理器#ifndef
假设我有C 预处理器#ifndef,c,header-files,ifndef,C,Header Files,Ifndef,假设我有a.h,其中包括以下内容: <stdbool.h> <stddef.h> <stdin.h> 假设我还有b.h,其中也包括。如果a.h中有#ifndef预处理器定义语句,而b.h没有。a.h是否只包含b.h中未包含的内容?因此,当b.h包含a.h时,a.h是否包含stddef.h和stein.h而不重新包含stdbool.h或者这些预处理器定义函数仅用于查看是否重新定义了整个类,而不是其中的特定函数 编辑: 另外,假设b.h包含另一个头文件,该头
a.h
,其中包括以下内容:
<stdbool.h>
<stddef.h>
<stdin.h>
假设我还有b.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
。这会导致错误吗?如果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_答案(void);// 所有C标准标题的制作必须确保可以多次按任意顺序包含:
标准标题可以按任何顺序包含;每个都可以包括在内
在给定范围内不止一次,与
只包括一次
大多数标题都以开头是正常的
#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_
并以以下行结束:
#endif
如果两次包含一个头,程序第二次将不会再次包含完整头,因为头中的\ifndef
、\define
和\endif
定义在使用多个文件中的相同头时,无论如何都会导致链接错误,所以不要这样做。
#endif