2017-05-18 9 views
6

मैं सोच रहा था, जब हेडर फाइलें शामिल हैं, तो क्या फाइलों की गहराई बिना सीमा के बढ़ सकती है? क्या आप संकलन समय पर एक सीमा निर्दिष्ट कर सकते हैं?शीर्षलेख समावेशन गहराई सीमा

उदाहरण:

main.c:

#include "A.h" 
const int xyz = CONST_VALUE; 

A.h:

#include "B.h" 

B.h:

#include "C.h" 

...

+०१२३५१६४१०६

...

...

Z.h:

#define CONST_VALUE (12345) 

मैं सही हूँ? क्या हेडर फ़ाइलों को अंतहीन रूप से शामिल किया जा सकता है?

+1

सी ++ से संबंधित एक संबंधित प्रश्न: http://stackoverflow.com/questions/12125014/are-there-limits-to-how-deep-nesting-of-header-inclusion-can-go। उत्तर में से एक सी ++ मानक से उद्धरण देता है जैसा कि सिफारिश की जाती है, लेकिन जरूरी नहीं कि कम से कम 256 घोंसले के लिए समर्थन शामिल है। कई कार्यान्वयन बहुत गहन घोंसले का समर्थन करते हैं। –

उत्तर

4

एक सीमा है जो संकलक के आधार पर भिन्न होती है।

6 A #include preprocessing directive may appear in a source file that has been read because of a #include directive in another file, up to an implementation-defined nesting limit (see 5.2.4.1).

धारा 5.2.4.1:

The implementation shall be able to translate and execute at least one program that contains at least one instance of every one of the following limits:

...

  • 15 nesting levels for #included files

तो मानक कहा गया है कि अनुरूप कार्यान्वयन में कम से कम का समर्थन करना चाहिए

[सी मानक]) ( http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) की धारा 6.10.2 से

15 स्तर गहरे, लेकिन संभवतः अधिक।

प्रैक्टिस में, संभवतः आप ऐसी सीमा को तब तक नहीं मारेंगे जब तक कि आप अपनी फ़ाइलों में लूप के साथ समाप्त न हों।

उदाहरण के लिए यदि आप ऐसा करते हैं:

main.h:

#include "main.h" 

extern int x; 

main.c:

error: #include nested too deeply

:

#include <stdio.h> 
#include "main.h" 

int x = 2; 

int main() 
{ 
    printf("x=%d\n",x); 
    return 0; 
} 

जीसीसी आपको निम्न त्रुटि दे देंगे

मेरे मामले में (जीसीसी 4.8.5) , इससे पहले कि यह गलती से पहले 200 स्तर गहरा हो गया। विवरण के लिए the gcc preprocessor manual, section 11.2 देखें।

एमएसवीसी के लिए, इसमें 10 (see here) की गहराई शामिल है। ध्यान दें कि इसका मतलब है (अन्य कारणों से) कि एमएसवीसी मानक-अनुरूप कंपेलर नहीं है।

+0

मैं सोच रहा था कि लूपिंग को रोकने पर एक बार 'प्रोग्मा' का क्या प्रभाव होगा? – ryyker

+0

@ryyker हां यह होगा।गार्ड ('#ifndef X #define X # endif') के समान ही, जब तक आप उनके अंदर शामिल करते हैं, जो आपको करना चाहिए। –

संबंधित मुद्दे