マクロ関数への引数としてマクロ定数を渡そうとしているときに問題が発生しています。他のマクロを引数として使用してCマクロを呼び出す
は、次のコードを考えてみましょう -
#define ERROR 10
#define MAIN "Main:"
#define LOG(lvl,mod,fmt,...) \
char msg[256] = {0}; \
snprintf(msg, 256, "%s: %d: "fmt,mod,lvl,##__VA_ARGS__)
int main()
{ ....
LOG(ERROR, MAIN, "This is a log statement.\n"); // Doesn't compile
LOG(10, "Main:", "This is a log statement.\n"); // Compiles
....
}
2番目のログ文がコンパイルされますが最初のログステートメントは、次のコンパイルエラーを生成 -
error: expected `)' before ‘;’ token
error: expected primary-expression before ‘,’ token
error: expected `;' before ‘)’ token
なぜこの出来事はありますか?私は、ロギングレベルとモジュール定数のセットを定義し、LOG()マクロを呼び出す際にそれを使用したいと考えています。
を、しかし、あなたの 'LOG'マクロはせずに、簡単な' if'文またはループ本体では動作しません明示的なブレイザー。ほとんどの人が 'do {...} while(0)'でマクロを囲んでいるのです。 –
マクロは同じスコープ内に複数の 'msg'変数を宣言するため、壊れています。 – Droppy
問題を解決する方法として、プリプロセッサを実行した後に停止して、マクロ展開がどのようなコードを作成するかを確認するようにコンパイラに指示します。 –