我在 MSDN 或其他地方找不到任何内容,但是对于标头包含的嵌套深度是否存在硬编码限制?示例:
// H1.h
// guards etc.
#include "H2.h"
// H2.h
// guards etc.
#include "H3.h"
//...
// HN.h <---- how large can N get??
我想知道标准中是否有关于此的内容。如果答案是实现定义的,那么我主要对 Visual Studio 工具链感兴趣。
标准也对此做了一些说明(关于实施数量的部分,附件B):
这些限制可能会限制包括下述内容在内的数量 或其他。建议在每个数量后面加上括号内的数字 作为该数量的最小值。然而,这些数量仅 指导方针,并不决定合规性。
...
- #include 文件的嵌套级别 [256]。
请注意,这只是建议的最小值,因此编译器可能不支持那么多包含项(但大多数编译器都支持,如其他答案所示)。
我编写了一个包含自身的头文件,并使用 MSVS 2010 对其进行了编译。这给出了错误消息:
fatal error C1014: too many include files : depth = 1024
是的:200。至少对于我的 gcc 版本来说是这样。
可以轻松测试:
#!/bin/bash
i=0
touch "test$i.c"
while gcc -c "test$i.c"; do
j="$[ $i + 1 ]"
echo "#include \"test$i.c\"" > "test$j.c"
i="$j"
echo "$j" | grep -q "000$" && echo "$j are fine"
done
这产生:
In file included from test2.c:1:0,
from test3.c:1,
from test4.c:1,
...
from test198.c:1,
from test199.c:1,
from test200.c:1:
test1.c:1:19: error: #include nested too deeply
来自 MSDN for Visual Studio 2012:
包含文件的嵌套最多可达 10 层。
更新:
这个“官方”限制可能更多的是一个指导原则,这样人们就不会无缘无故地开始堆叠包含文件。我不相信至少几十年来还没有一个编译器具有如此严格的包含限制。
例如,根据其他答案之一,至少有一个版本的 VS C++ 编译器支持大约 1024 个嵌套级别。