会社で、オプションなしでコンパイルされた古い C コードを調べていgcc -flags
たところ、奇妙なコード行に出くわしました。
#define foo(a,b) foonew(a,b, ;)
誰かが私にこれが何をするのか説明できますか?
編集: でコンパイルされていない大きなコード ベースの一部であるためgcc -flags
、前処理form.Compilation
がエラーや警告なしで正常に完了したかどうかを確認できません。
a
セミコロンは、や と同様に、前処理トークンとして機能しますb
。別のマクロへのパラメーターとして使用できます。
例えば
#define foonew(x,y,z) (x + y) z
#define foo(a,b) foonew(a,b, ;)
int main()
{
int one = 1;
int two = 2;
int three = foo(one, two) // no semicolon here!
return three;
}
これはうまくいきます
#define foo(a,b) foonew(a,b)
これを試して。
マクロ引数は空にすることができます (ゼロの前処理トークンで構成されます)。例えば、
#define SUM(a,b,c) a + b + c
SUM(1,,3) /* No error message.
aに1、cに3を代入します。*/ 識別子リストが省略記号で終わらない場合、マクロ呼び出しの引数の数は、対応するマクロ定義のパラメーターの数と同じでなければなりません。パラメーターの置換中、指定されたすべての引数 (区切りのコンマを含む) が置換された後に残っている引数は、可変引数と呼ばれる 1 つの引数に結合されます。