我想知道,包含头文件时,包含文件的深度可以无限增加吗?你能在编译时指定一个限制吗?
Example:
main.c:
#include "A.h"
const int xyz = CONST_VALUE;
A.h:
#include "B.h"
B.h:
#include "C.h"
...
...
...
Z.h:
#define CONST_VALUE ( 12345 )
我对么?头文件可以无限包含吗?
有一个限制,该限制因编译器而异。
来自 [C 标准] 第 6.10.2 节)(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf):
6 A #include
由于另一个文件中的 #include 指令,预处理指令可能会出现在已读取的源文件中,向上
到实现定义的嵌套限制(参见 5.2.4.1)。
第 5.2.4.1 节:
该实现应能够翻译并执行至少一个
程序至少包含其中每一个的一个实例
以下限制:
...
因此,该标准规定,符合要求的实现必须支持至少 15 级深度,但可能更多。
实际上,除非您的包含文件中出现循环,否则您可能不会达到这样的限制。
例如,如果您这样做:
main.h:
#include "main.h"
extern int x;
main.c:
#include <stdio.h>
#include "main.h"
int x = 2;
int main()
{
printf("x=%d\n",x);
return 0;
}
gcc 会给你以下错误:
错误:#include 嵌套太深
在我的例子中(gcc 4.8.5),它在出错之前已经深入了大约 200 层。看gcc 预处理器手册,第 11.2 节 https://gcc.gnu.org/onlinedocs/gcc-4.8.5/cpp.pdf了解详情。
对于 MSVC,它支持包含深度为 10 (see here https://msdn.microsoft.com/en-us/library/36k2cdd4.aspx)。请注意,这意味着(除其他原因外)MSVC 不是符合标准的编译器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)