12

「DEBUG:」を引数の先頭に追加し、その引数をprintfに渡す関数マクロをCで実装しようとしています。

#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__)

これにより、gccで次のエラーが発生します。

src/include/debug.h:4:70: error: expected expression before ‘)’ token
#define DBG(format, ...) printf("DEBUG: " #format "\n", __VA_ARGS__)
                                                                   ^

おそらく、フォーマットを文字列化し、変数引数をprintfに渡す必要がありますが、これまでのところ、このエラーを乗り越えることはできません。


編集

##引数の文字列化と二重ハッシュ ( )をあきらめた後、次の__VA_ARGS__エラーが発生しました。

src/lib/cmdlineutils.c: In function ‘version’:
src/lib/cmdlineutils.c:56:17: warning: ISO C99 requires rest arguments to be used [enabled by default]
  DBG("version()");

引数の後にコンマを配置する必要がありますか?

DBG("version()",);  // ?

参考までに、DBG() は次のようになります。

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)
4

3 に答える 3

20

これは、少なくとも 1 つの可変引数がない場合に発生します。この GNU 拡張機能を試して修正できます。

#define DBG(format, ...) printf("DEBUG: " #format "\n", ##__VA_ARGS__)
                                                        ^^

GNU doc で説明されているように:

[if] マクロの使用時に可変引数を省略した場合、'##' の前のコンマが削除されます。

于 2013-09-23T20:28:52.900 に答える
0

MSDNでこれをチェックしてください。これには、使用している Variadic Macros に関する情報が含まれています。

于 2013-09-23T20:22:13.040 に答える
0

フォーマットを文字列化する必要があるのはなぜですか。そのままにしておくことができます。マクロを使用するときに文字列として扱うだけです。

cnicutar が提案したエラーは、VA_ARGS の前に「##」を追加することで解決できます

#define DBG(format, ...) printf("DEBUG: " format "\n", ##__VA_ARGS__)

使用例:

DBG("%d - %s", a,b);
于 2013-09-23T20:27:05.503 に答える