2012-08-25 34 views
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工具鏈感興趣。

+3

這很容易弄清楚。只要有一個文件包含它自己,並查看它何時發生錯誤。如果錯誤信息沒有深度,您可以使用'#warning'強制標題打印出來。例如,Clang停在200。 –

回答

6

該標準還提到了一些關於它的內容(關於實施數量部分,附錄B):

該限制可能會限制數量,包括下面描述的數量 或其他。每個數量後面的括號中的數字建議爲 作爲該數量的最小值。但是,這些數量僅爲 準則,並不確定是否符合規定。

...

  • 嵌套層次#include文件[256]。

請注意,這只是一個建議的最低,所以編譯器可能不支持那麼多的夾雜物(但大多數編譯器一樣,在其他的答案中所示)。

+0

+1爲標準報價並被接受。這是我正在尋找的。 – TemplateRex

3

MSDN for Visual Studio 2012

的嵌套包含文件可以持續到10級。

UPDATE

這個「官方」限制可能更多的是指導,使人們將無法啓動堆棧包括無故文件。我不認爲至少有幾十年的編譯器具有如此嚴格的包含限制。

例如,根據其他答案之一,VS C++編譯器的至少一個版本支持大約1024個嵌套級別。

+2

與其他編譯器相比,VS的C++編譯器很糟糕 –

+1

@Anubis先生:我懷疑這個「官方」限制實際上更多的是指導原則,因此人們不會無緣無故地開始堆棧包含文件。實際的限制可能要高很多 - 儘管這不會讓VS C++編譯器吸得更少...... – thkala

+0

「我懷疑這個」官方「限制實際上更多的是一個指導方針,因此人們不會開始堆棧包含無緣無故的文件「我不明白爲什麼人們會在沒有任何合理理由的情況下在他們的項目中這樣做 –

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 
6

我寫了一個頭文件,其中包括自身和2010年MSVS編譯它這給了錯誤消息:

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

jeez !! MS的MSDN甚至沒有更新,請參閱@ thkala的答案 –

+0

+1謝謝。我沒有想到自我包容性來測試極限。 – TemplateRex