1

よりクリーンなエラー処理のために、マクロを使用します (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つまり、引数がマクロに渡されていないかどうかを確認する方法が必要です。

4

1 に答える 1

3

提案された質問の助けを借りて、このようにマクロを変更できるようになりました。

#define A() .... //your macro

#define A_CALC_ARG_IMPL(_1,N,...) N
#define A_CALC_ARG(...) A_CALC_ARG_IMPL(__VA_ARGS__,0)

#define A_NEW(...) A(cond, A_CALC_ARG(__VA_RGS__))

したがって、渡さない場合、新しいA_NEWマクロ呼び出しはに展開されます。A(cond, 0)msg

Variadic マクロは、このブログでうまく説明されています。

于 2013-12-22T12:16:38.010 に答える