预处理器#ifndef

假设我有ah其中包括以下内容:

    

假设我也有bh ,其中还包括 。 如果ah#ifndef预处理器定义语句而bh没有。 请问ah只包括bh没有包含的内容吗? 那么当bh包含ah ,会不会包括stddef.hstein.h而不重新包含stdbool.h或那些预处理器定义函数只用于查看是否重新定义了这个整个类,而不是它中的特定函数?

编辑:

另外,假设bh包含另一个包含stdbool.h头文件 – 这使得bh从该类获得了stdbool.hah 。 这会导致错误吗?

必须制作所有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再次包含完整的标题