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 レベルまで継続できます。

更新

この「公式の」制限は、人々が理由もなくインクルード ファイルをスタックし始めないようにするための、おそらくガイドラインのようなものです。少なくとも数十年の間、これほど制限的な包含制限を持つコンパイラーがあったとは思いません。

たとえば、他の回答の1つによると、VS C++コンパイラの少なくとも1つのバージョンは、約1024のネストレベルをサポートしています。

于 2012-08-25T19:36:51.640 に答える