-5

会社で、オプションなしでコンパイルされた古い C コードを調べていgcc -flagsたところ、奇妙なコード行に出くわしました。

#define foo(a,b) foonew(a,b, ;)

誰かが私にこれが何をするのか説明できますか?

編集: でコンパイルされていない大きなコード ベースの一部であるためgcc -flags、前処理form.Compilationがエラーや警告なしで正常に完了したかどうかを確認できません。

4

2 に答える 2

1

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;

}
于 2012-11-24T12:58:26.370 に答える
0

これはうまくいきます

 #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 つの引数に結合されます。

于 2012-09-08T17:07:21.907 に答える