2012-11-18 22 views
6

C önişlemcisi kodu kaç kez geçer? Ben gcc kod aşağıdaki test edilenC önişlemcisi kaç geçiş yapar?

hata yok 4.7.2

#define a 5 
#define b a 
#define c b 
#define d c 
#define e d 
#define f e 
#define g f 
#define h g 
#define j h 
#define k j 
#define l k 
#define m l 

int main(void) {return d;} 

:

$ gcc -E 1.c 
# 1 "1.c" 
# 1 "<command-line>" 
# 1 "1.c" 
# 14 "1.c" 
int main(void) {return 5;} 

standart davranış mı?

+5

Neden * bir hata olur? –

cevap

13

C preprocesor, genişletilecek başka bir şey kalmayıncaya kadar devam ediyor. Bu bir geçer meselesi değil; Bu bir bütünlük meselesi.

Makroların yinelenen genişlemesini önler. Makro bir kez genişletildikten sonra, değiştirilen metinde yeniden genişletilmez.

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:18)

...

  • 4095 macro identifiers simultaneously defined in one preprocessing translation unit

18) Implementations should avoid imposing fixed translation limits whenever possible.

Yani, önişlemci en az 4095 işlemek gerekir:


standart makro genişleme sınırları hakkında diyor tek şey diyor §5.2.4.1 Çeviri sınırları içindedir makroları ve eğer bu makrolardan biri hariç hepsi örneğinizde olduğu gibi sırayla başka bir makroya genişlerse, sonuç doğru olmalıdır.