2012-08-25 44 views
6

मुझे एमएसडीएन या अन्य जगहों पर कुछ भी नहीं मिल रहा है, लेकिन क्या हेडर समावेशन के गहरे घोंसले के लिए हार्ड-कोड की सीमाएं हैं? उदाहरण:क्या हेडर समावेशन के गहरे घोंसले के लिए सीमाएं हैं?

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

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

//... 

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

मुझे आश्चर्य है कि इसके बारे में मानक में कुछ भी है या नहीं। अगर उत्तर कार्यान्वयन परिभाषित किया गया है, तो मैं मुख्य रूप से विजुअल स्टूडियो टूलचैन में रूचि रखता हूं।

+3

यह पता लगाना आसान है। बस एक फ़ाइल में स्वयं शामिल है, और जब यह त्रुटियों को देखते हैं। यदि त्रुटि संदेश में गहराई नहीं है, तो आप कुछ प्रिंट करने के लिए हेडर को मजबूर करने के लिए '# चेतावनी 'का उपयोग कर सकते हैं। क्लैंग 200 पर बंद हो जाता है, उदाहरण के लिए। –

उत्तर

6

मानक इसके बारे में कुछ भी कहता है (कार्यान्वयन मात्राओं के बारे में, अनुबंध बी):

सीमाएं या अन्य लोगों के नीचे वर्णित मात्राओं को सीमित कर सकती हैं। प्रत्येक मात्रा के बाद ब्रैकेट किए गए नंबर को उस मात्रा के लिए न्यूनतम के रूप में अनुशंसित किया जाता है। हालांकि, ये मात्रा केवल दिशानिर्देश हैं और अनुपालन निर्धारित नहीं करते हैं।

...

  • # शामिल फ़ाइलें [256] के लिए नेस्टिंग स्तरों।

ध्यान दें कि यह केवल एक अनुशंसित न्यूनतम है, इसलिए एक संकलक है कि कई समावेशन का समर्थन नहीं कर सकते हैं (लेकिन सबसे compilers, कर के रूप में अन्य उत्तर में दिखाया गया है)।

+0

+1 और स्वीकार किया गया। यह वही है जिसे मैं देख रहा था। – TemplateRex

3

MSDN for Visual Studio 2012 से:

की नेस्टिंग शामिल फ़ाइलें 10 स्तर तक जारी रख सकते हैं।

अद्यतन:

यह "आधिकारिक" सीमा शायद एक दिशानिर्देश के अधिक ताकि लोगों को ढेर शुरू नहीं होगी है बिना किसी कारण के फ़ाइलों में शामिल हैं। मुझे विश्वास नहीं है कि कम से कम कुछ दशकों तक इतनी प्रतिबंधित समावेश सीमा के साथ एक कंपाइलर रहा है।

उदाहरण के लिए, अन्य उत्तरों में से एक के अनुसार वीएस सी ++ कंपाइलर के कम से कम एक संस्करण के बारे में 1024 घोंसले के स्तर का समर्थन करता है।

+2

वीएस का सी ++ कंपाइलर अन्य कंपाइलर्स की तुलना में बेकार है –

+1

@ श्री अनीबिस: मुझे संदेह है कि यह "आधिकारिक" सीमा वास्तव में एक दिशानिर्देश का अधिक है ताकि लोग बिना किसी कारण के फाइलों को ढेर करना शुरू कर सकें।वास्तविक सीमा शायद बहुत अधिक है - हालांकि इससे वीएस सी ++ कंपाइलर कम नहीं होता है ... – thkala

+0

"मुझे संदेह है कि यह" आधिकारिक "सीमा वास्तव में एक दिशानिर्देश का अधिक है ताकि लोग ढेर करना शुरू नहीं कर सकें किसी भी कारण से फाइलें "मैं नहीं करता कि लोग अपनी परियोजनाओं में बिना किसी उचित कारण के –

4

हां: 200. कम से कम जीसीसी के मेरे संस्करण के लिए।

यह आसानी से परीक्षण किया जा सकता:

#!/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

मैं एक हेडर फाइल जो स्वयं भी शामिल है और MSVS 2010 के साथ संकलित यही कारण है कि त्रुटि संदेश दिया लिखा है:

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

जीज़ !! एमएस का एमएसडीएन भी अपडेट नहीं किया गया है, देखें @ थकला का जवाब –

+0

+1 धन्यवाद। मैंने सीमाओं का परीक्षण करने के लिए आत्म-समावेश के बारे में नहीं सोचा था। मानक उद्धरण के लिए – TemplateRex