私の知る限り、gcc では次のように記述できます。
#define DBGPRINT(fmt...) printf(fmt);
VC++でそれを行う方法はありますか?
私の知る限り、gcc では次のように記述できます。
#define DBGPRINT(fmt...) printf(fmt);
VC++でそれを行う方法はありますか?
はい、ただし VC++ 2005 以降のみです。例の構文は次のようになります。
#define DBGPRINT(fmt, ...) printf(fmt, __VA_ARGS__)
完全なリファレンスはこちらです。
はい、バージョン 2005 以降の Visual Studio C++ でこれを行うことができます (VS 2003 についてはわかりません)。VA_ARGSを見てください。基本的に次のようなことができます。
#define DBGPRINTF(fmt, ...) printf(fmt, __VA_ARGS__)
マクロへの可変引数は、'...' args として提供される関数に渡され、そこで va_args を使用してそれらを解析できます。
VA_ARGSとマクロを使用すると、奇妙な動作が発生する可能性があります。VA_ARGSは変数であるため、引数が 0 になる可能性があることを意味します。これにより、意図しない場所にコンマが残る可能性があります。
非標準の拡張子を使用したくない場合は、追加のブラケットを提供する必要があります:
#define DBGPRINT(args) printf(args);
DBGPRINT(("%s\n", "Hello World"));
__FILE__
マクロの機能( 、、__LINE__
トークンの貼り付けなど)が実際に必要ない場合は、を使用して可変個引数関数を作成することを検討してstdargs.h
ください。を呼び出す代わりに、可変引数リストを渡すためにprintf()
可変個引数関数を呼び出すことができます。vprintf()
MSVC 7.1 (.NET 2003) の場合、これは機能します。
#if defined(DETAILED_DEBUG)
#define DBGPRINT fprintf
#else
__forceinline void __DBGPRINT(...){}
#define DBGPRINT __DBGPRINT
#endif
あなたが探しているのは [可変長マクロ]( http://msdn.microsoft.com/en-us/library/ms177415(VS.80).aspx)と呼ばれるものです。
リンクの要約: はい、VC++ 2005 以降。
MSDN で「 VA_ARGS」と va_list を検索してください。
以下はうまくいくはずです。( Variadic マクロへのリンクを参照)
(以下の例は、固定引数と可変引数を示しています。)
# define DBGPRINTF(fmt,...) \
do { \
printf(fmt, __VA_ARGS__); \
} while(0)
ほとんど。ただし、それはそれよりも醜いです (そして、おそらくマクロ自体に末尾のセミコロンは必要ありません:
#define DBGPRINT(DBGPRINT_ARGS) printf DBGPRINT_ARGS // note: do not use '(' & ')'
使用するには:
DBGPRINT(("%s\n", "Hello World"));
(括弧のペアがありませんでした)。
元の質問に VC++ のバージョンが記載されておらず、すべてのコンパイラで可変長マクロがサポートされていない理由がわかりません。