1

C マクロ プリプロセッサ (C99) を実装しています...

次の行動にビックリ…。

例1:

#define PASTE(x) X_##x
#define EXPAND(x) PASTE(x)
#TABSIZE 1024 を定義
#define BUFSIZE TABSIZE

貼り付け(BUFSIZE)
EXPAND(BUFSIZE)

次のように展開します。

X_BUFFSIZE
X_1024

例2:

#define EXPAND(s) TO_STRING(s)
#define TO_STRING(s) #s
#FOUR 4 を定義する

TO_STRING(4)
エキスパンド(4)

次のように展開します。

"四"
「4」

私はCの「無料」標準を調べましたが、次のものが見つかりませんでした...

  1. 実際、プリプロセッサが実行するパスの数は?
  2. 最初に 1 つのマクロを置き換えてから、別のマクロを置き換えるか、など
  3. #defineそれとも、 s が 1 つずつ発生するときにそれらを保存して置換しますか?
  4. ファイルのインクルードが最初に行われるか、マクロ展開のどちらで行われますか?
4

2 に答える 2

2

初心者はこのページを読むべきです。次のような宝石が含まれています。

C 標準では、任意のパラメーターが展開された可能性のある引数に置き換えられた後、置換リストがネストされたマクロに対してスキャンされると規定されています。さらに、このスキャン中に展開されなかった置換リスト内の識別子は、展開されなかった理由が問題のマクロが無効にされたことが原因である場合、今後展開の対象にはなりません。

このことから、一定数のパスがないことが推測できると思います。マクロ展開が発生するたびに (「置換リスト」が生成されます)、新しく作成されたテキストがスキャンされてさらに展開されます。これは再帰的なプロセスです。

于 2013-03-15T10:50:16.280 に答える
1

実際、プリプロセッサが実行するパスの数は?

  1. # PARAMETERそのパラメータの文字列化によって のすべての出現を置き換えます
  2. 間にあるすべてのトークンを結合し##ます
  3. パラメータの残りのすべての出現箇所をそれらの値で置き換えます
  4. 他のマクロの出現箇所の置換テキストを再帰的に展開します。(マクロ自体は、これらの再帰呼び出しでブロックされます。)

1 つのマクロを最初に置き換えてから別のマクロに置き換えるか、それとも #defines が 1 つずつ検出されたときにそれらを保存して置き換えますか?

マクロは、プログラム テキスト内で見つかった順序で、または上記の再帰的置換中に置換されます。

ファイルのインクルードが最初に行われるか、マクロ展開のどちらで行われますか?

最初に、または#includeで囲まれた何かで構成されていない場合、 an の引数が展開されます。その場合、それはまさにその中にある何かにつながる必要があります<>""<>""

于 2013-03-15T12:32:51.190 に答える