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