8

Cプリプロセッサはコードに対して何回パスしますか?

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

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

4

1 に答える 1

15

Cプリプロセッサは、拡張するものがなくなるまで続行します。パスの問題ではありません。それは完全性の問題です。

マクロの再帰的な展開を回避します。マクロが一度展開されると、置換テキストでは再展開されません。


マクロ展開の制限について標準で述べられているのは、§5.2.4.1変換の制限だけです。

実装は、次の制限のすべてのインスタンスを少なくとも1つ含む、少なくとも1つのプログラムを変換して実行できる必要があります。18)

..。

  • 1つの前処理変換ユニットで同時に定義された4095個のマクロID

18)実装では、可能な限り、固定の翻訳制限を課すことを避ける必要があります。

したがって、プリプロセッサは少なくとも4095個のマクロを処理できる必要があり、例のように、これらのマクロの1つを除くすべてが別のマクロに順番に展開される場合、結果は正しい必要があります。

于 2012-11-18T16:30:29.037 に答える