2017-05-18 18 views
6

Başlık dosyalarını dahil ederken, içerme dosyaların derinliği sınırsız artırabilir mi merak ediyorum? Derleme zamanında bir limit belirtebilir misiniz?Header Inclusion Depth Limit

Örnek:

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) 

ben haklı mıyım? Başlık dosyaları sonsuz olarak dahil edilebilir mi?

+1

C++ ile ilgili bir soru: http://stackoverflow.com/questions/12125014/are-there-limits-to-how-deep-nesting-of-header-inclusion-can-go. Cevaplardan biri, en az 256 iç içe geçmiş kapsamı için destek gerektiren, ancak zorunlu olarak gerektirmeyen C++ standardından bir teklif verir. Birçok uygulama, daha derin bir yuvalamayı destekler. –

cevap

4

Derleyiciye göre farklılık gösteren bir sınır vardır.

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).

Bölüm 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

Böylece standart durumları uygun uygulamalar en azından desteklemelidir [C standart]) (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) bölümünde 6.10.2 kaynaktan

15 seviyeleri derin, ama muhtemelen daha fazla.

Uygulamada, içerme dosyalarınızda bir döngü ile sonuçlanmadıkça, muhtemelen böyle bir sınıra ulaşmayacaksınız.

Örneğin bunu yaparsanız:

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; 
} 

gcc size aşağıdaki hatayı verecektir

Benim durumumda (gcc 4.8.5) Ortaya çıkmadan yaklaşık 200 katı geçti. Ayrıntılar için bkz. the gcc preprocessor manual, section 11.2.

MSVC için, 10 (see here) kapsam dahilinde bir derinliği destekler. Bunun, MSVC'nin standart uyumlu bir derleyici olmadığı (başka nedenlerden dolayı) anlamına geldiğini unutmayın.

+0

#pragma'nın bir zaman döngüsünü engellemeye ne gibi bir etkisi olacağını merak ediyordum? – ryyker

+0

@ryyker Evet öyle olacak.Muhafızları (# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # X # endf #), yapmalısınız. –