0

c89 gcc 4.7.4

私は次のようなマクロを試していました:

#define LOG_INFO_1(fmt, ...) printf(fmt, __VA_ARGS__)
#define LOG_INFO_2(...) printf(__VA_ARGS__)

そして、このように使用します:

LOG_INFO_1("%s:%d", __func__, __LINE__);
LOG_INFO_2("%s:%d", __func__, __LINE__);

出力はまったく同じ形式になります。fmt最初のマクロで引数を使用することの利点は何ですか? 本当に必要ではないようです。どうすればそれを利用できますか?

4

3 に答える 3

5

最初のパラメーターが であることを指定してもfmt、コンパイラー/コンピューターに違いはありません。

ただし、あなたのコードを使用する可能性のある他のプログラマーにとっては大きな違いになると思います。

を見るとLOG_INFO_1(fmt, ...)、このマクロが printf スタイルのフォーマット文字列を取り、その後に追加のパラメーターがあることが強く示唆されます。

を見るとLOG_INFO_2(...)、どのパラメータをどの順序で渡すべきかわかりません。最初のパラメータはRFC 5424重大度コードにするべきでしょうか? たぶん、書き込み先の出力ストリームにする必要がありますか?マクロには、答えを示唆するものは何もありません。

できるだけ細かく指定して...、どうしても必要なところだけというようなあいまいなところは残して、後から来るプログラマーがやりやすいようにすべきだと思います。

于 2012-10-23T17:10:47.583 に答える
2

マクロの場合、どのバリエーションを使用してもかまいません。プリプロセッサは、両方のマクロから同じ C コードを生成します。


可変引数関数の場合、少なくとも 1 つの引数を定義する必要があります。

そう

void foo(const char * fmt, ...);

コンパイルしますが、

void bar(...);

しません。

于 2012-10-23T17:06:10.783 に答える