[英]Preprocessor #ifndef
假设我有ah
,其中包括以下内容:
<stdbool.h>
<stddef.h>
<stdin.h>
假设我也有bh
,其中还包括<stdbool.h>
。 如果ah
有#ifndef
预处理器定义语句,而bh
没有。 请问ah
只包括bh
没有包含的内容吗? 所以,当bh
包括ah
,会ah
包括stddef.h
和stein.h
,而不是重新加入stdbool.h
或仅见惯了这种全班是否被重新定义的预处理器定义的功能,并在它不是具体的功能呢?
编辑:
另外,假设bh
包含另一个包含stdbool.h
头文件 - 这使得bh
从该类中获得了stdbool.h
和ah
。 这会导致错误吗?
如果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();
}
必须制作所有C标准标题,以便它们可以按任何顺序包含多次:
标准标题可以按任何顺序包含在内; 在给定范围内,每个可以被包括不止一次,与仅被包括一次的效果不同
大多数标头开始是正常的
#ifndef _HEADERFILENAME_H_
#define _HEADERFILENAME_H_
并以以下行结束:
#endif
如果你包括一个标题两次,第二次你的程序将不会再次包含完整的标题,因为#ifndef
, #ifndef
#define
和#endif
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.