よりクリーンなエラー処理のために、マクロを使用します (C99 および GCC 拡張機能を使用します)。動作は標準のようassert
です:
#define A(cond, msg, ...) ({ \
if (!(cond)) { \
if (msg) \
say(msg, ##__VA_ARGS__); \
else \
say("Error at file %s, function %s, line %u: %s", \
__FILE__, __func__, __LINE__, #cond); \
A_RETURN(); \
} \
})
say
フォーマットされた出力です。そして、そのように使用します:
#undef A_RETURN
#define A_RETURN() ({ fclose(f); free(p); return false; })
A(foo() != FOO_ERROR, 0);
A(bar() != BAR_ERROR, "bar failed");
具体的なエラー メッセージがない場合は、 と書く必要がありますA(cond, 0)
。A(cond)
しかし、この場合は書きたいだけです。A
この動作のためにマクロを変更するにはどうすればよいですか? msg
つまり、引数がマクロに渡されていないかどうかを確認する方法が必要です。