标头包含的嵌套深度是否有限制?

问题描述 投票:0回答:4

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

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

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

//...

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

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

c++ nested limit header-files
4个回答
8
投票

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

这些限制可能会限制包括下述内容在内的数量 或其他。建议在每个数量后面加上括号内的数字 作为该数量的最小值。然而,这些数量仅 指导方针,并不决定合规性。

...

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

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


6
投票

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

fatal error C1014: too many include files : depth = 1024

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

3
投票

来自 MSDN for Visual Studio 2012

包含文件的嵌套最多可达 10 层。

更新

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

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

© www.soinside.com 2019 - 2024. All rights reserved.