我在 MSDN 或其他地方找不到任何东西,但是对于标题包含的嵌套深度是否存在硬编码限制?例子:
// H1.h
// guards etc.
#include "H2.h"
// H2.h
// guards etc.
#include "H3.h"
//...
// HN.h <---- how large can N get??
我想知道标准中是否有任何关于此的内容。如果答案是定义了实现,那么我主要对 Visual Studio 工具链感兴趣。
我在 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
包含文件的嵌套最多可以持续 10 层。
更新:
这个“官方”限制可能更像是一个指导方针,这样人们就不会无缘无故地开始堆叠包含文件。我不相信至少几十年来没有一个编译器具有如此严格的包含限制。
例如,根据其他答案之一,至少一个版本的 VS C++ 编译器支持大约 1024 个嵌套级别。