2012-11-18 10 views
6

Cプリプロセッサはコードを何回通過させますか?Cプリプロセッサはいくつのパスを作成しますか?

私は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の上で、次のコードをテストしたエラーはありません。

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

は、それが標準的な動作ですか?

+5

なぜ* * *エラーがありますか? –

答えて

13

Cプリプロセッサは、何も展開されなくなるまで続きます。パスの問題ではありません。それは完全性の問題です。

マクロの再帰的展開を避けます。マクロが一度拡張されると、置換テキスト内で再展開されません。


マクロ展開の制限に関する標準は言うだけの事は、それが言う§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:18)

...

  • 4095 macro identifiers simultaneously defined in one preprocessing translation unit

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

、プリプロセッサは、少なくとも4095を処理できなければなりませんそれらのマクロの1つを除いてすべてが別のマクロに順番に展開されている場合、結果は正しいはずです。

関連する問題