预处理器#ifndef
假设我有ah
其中包括以下内容:
假设我也有bh
,其中还包括 。 如果
ah
有#ifndef
预处理器定义语句而bh
没有。 请问ah
只包括bh
没有包含的内容吗? 那么当bh
包含ah
,会不会包括stddef.h
和stein.h
而不重新包含stdbool.h
或那些预处理器定义函数只用于查看是否重新定义了这个整个类,而不是它中的特定函数?
编辑:
另外,假设bh
包含另一个包含stdbool.h
头文件 – 这使得bh
从该类获得了stdbool.h
和ah
。 这会导致错误吗?
必须制作所有C标准标题,以便它们可以按任何顺序包含多次:
标准标题可以按任何顺序包含在内; 在给定的范围内,每个可以被包括不止一次,没有效果不同于仅包括一次
如果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(); }
大多数标头开始是正常的
#ifndef _HEADERFILENAME_H_ #define _HEADERFILENAME_H_
并以以下行结束:
#endif
如果你包括一个标题两次,那么你的程序第二次不会因为#ifndef
, #ifndef
#define
和#endif
再次包含完整的标题