6

我在 MSDN 或其他地方找不到任何东西,但是对于标题包含的嵌套深度是否存在硬编码限制?例子:

// H1.h
// guards etc.
#include "H2.h"

// H2.h
// guards etc.
#include "H3.h"

//...

// HN.h <---- how large can N get??

我想知道标准中是否有任何关于此的内容。如果答案是定义了实现,那么我主要对 Visual Studio 工具链感兴趣。

4

4 回答 4

8

该标准还对此做了一些说明(在关于实施数量的部分,附件 B):

这些限制可能会限制包括以下描述的数量或其他数量。建议将每个数量后面的括号中的数字作为该数量的最小值。但是,这些数量仅作为指导,并不能确定合规性。

...

  • #include 文件的嵌套级别 [256]。

请注意,这只是推荐的最小值,因此编译器可能不支持那么多包含(但大多数编译器都支持,如其他答案所示)。

于 2012-08-25T19:56:49.867 回答
6

我编写了一个包含自身的头文件,并使用 MSVS 2010 对其进行了编译。这给出了错误消息:

fatal error C1014: too many include files : depth = 1024
于 2012-08-25T19:40:11.203 回答
4

是: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
于 2012-08-25T19:39:30.803 回答
3

来自Visual Studio 2012 的 MSDN

包含文件的嵌套最多可以持续 10 层。

更新

这个“官方”限制可能更像是一个指导方针,这样人们就不会无缘无故地开始堆叠包含文件。我不相信至少几十年来没有一个编译器具有如此严格的包含限制。

例如,根据其他答案之一,至少一个版本的 VS C++ 编译器支持大约 1024 个嵌套级别。

于 2012-08-25T19:36:51.640 回答