假设我有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
- 使stdbool.h
具有a.h
来自该类和{{1}}。这会导致错误吗?
答案 0 :(得分:1)
如果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();
}
答案 1 :(得分:1)
必须制作所有C标准标题,以便它们可以按任何顺序包含多次:
标准标题可以包含在任何顺序中;每个都可以包括在内 在给定范围内不止一次,没有效果 只包括一次
答案 2 :(得分:0)
大多数标头以
开头是正常的#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_
并以以下行结束:
#endif
如果您包含标题两次,则由于#ifndef
,#define
和#endif