0

次のようなマクロを定義できますか:

#define ERROR_REPORT(LEVEL,SUB_LEVEL printf(

コンパイラは、この行に;. 「(」をエスケープする方法はありますか?

これは関数を置き換えることを意図しています:

  ERROR_REPORT(LEVEL,SUB_LEVEL
          "error, there is an error %d\n",
           error_id);

C 組み込み関数を使用

  printf("error, there is an error %d\n",
         error_id);

編集:「(」、「)」を1つ置き換えたいだけです。これを尋ねる理由は、問題として投稿されたコードが既にいくつかあるため、 ERROR_REPROT(... のような 1 行を printf( に置き換えたいだけです。

4

1 に答える 1

6

可変個引数マクロを使用することをお勧めします:

#define ERROR_REPORT(LEVEL, SUB_LEVEL, ...) \
    printf(__VA_ARGS__)

マクロの代わりに好きなものを入れることができますが、定義が間違っています。

#define ERROR_REPORT(LEVEL,SUB_LEVEL   printf(
/*      Error with missing `)` here ^ */

プリプロセッサには閉じ括弧が必要です。そうしないと、プリプロセス フェーズでエラーが発生します。

また、このマクロを使用しているときは、次のようにすることはできません。

ERROR_REPORT(LEVEL,SUB_LEVEL
      "error, there is an error %d\n",
       error_id);

SUB_LEVEL引数と文字列の間にコンマがないため、プリプロセッサはここでもエラーをスローします。

したがって、単一の左括弧を置き換えることができるかどうかという質問に対する答えは、単にいいえです。できません。

于 2012-08-15T08:32:42.027 に答える