11

次のようなデバッグ コードがあります。

#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define AT __FILE__ ":" TOSTRING(__LINE__)
void __my_error(const char*loc, const char *fmt, ...);
#define my_error(fmt, ...) __my_error(AT, fmt, ##__VA_ARGS__)

最後のマクロを使用して、エラーが発生した場所をデバッグ出力に挿入できるようにします。ただし、次のように関数を呼び出すと:

my_error("Uh oh!");

コードをC99 にしたいので、これをコンパイルすると、次のエラーが発生します。

error: ISO C99 requires rest arguments to be used

への呼び出しを変更することでこれを解決できることを知っています

my_error("Uh oh!", NULL);

しかし、見栄えを良くする方法はありますか? ありがとう!

4

1 に答える 1

14

この問題には2つの解決策があります。('stick with gcc'を数えると3つ)。

特別な場合のマクロ

固定文字列を印刷する場合の新しいマクロを追加します。

#define my_errorf(str) my_error(str, NULL)

プロ:余分なコードの最小量。
短所:間違ったマクロを使用するのは簡単です(ただし、少なくともコンパイル時にこれに気付くでしょう)。

fmt'...'の中に入れます

Varargマクロは、パラメーターとして__VA_ARGS__のみを持つことができます(vararg関数とは異なります)。したがって、fmt引数を__VA_ARGS__内に配置して、関数を変更できます。

void __my_error(const char *loc, ...);
#define my_error(...) __my_error(AT, __VA_ARGS__)

プロ:すべてのエラーメッセージに対して1つの構文/マクロ。
短所:関数を書き直す必要がありますが__my_error、これは不可能な場合があります。

于 2010-08-30T08:00:30.060 に答える