東方算程譚:こんなんアリかよで知った。
MSDN:Variadic Macrosに詳細は書いてある。
Visual Studio 2005以降で使えるのかな?
これ昔欲しかったんだよね〜。
ん?あ、欲しかったのは、可変長引数の関数から可変長引数の関数を呼ぶ方法だった。。。
↓こんなヤツ
void func( format, ... )
{
func2( format, ... );
}
とりあえずMSDNよりVariadic Macrosのサンプル
// variadic_macros.cpp #include <stdio.h> #define EMPTY #define CHECK1(x, ...) if (!(x)) { printf(__VA_ARGS__); } #define CHECK2(x, ...) if ((x)) { printf(__VA_ARGS__); } #define CHECK3(...) { printf(__VA_ARGS__); } #define MACRO(s, ...) printf(s, __VA_ARGS__) int main() { CHECK1(0, "here %s %s %s", "are", "some", "varargs1(1)\n"); CHECK1(1, "here %s %s %s", "are", "some", "varargs1(2)\n"); // won't print CHECK2(0, "here %s %s %s", "are", "some", "varargs2(3)\n"); // won't print CHECK2(1, "here %s %s %s", "are", "some", "varargs2(4)\n"); // always invokes printf in the macro CHECK3("here %s %s %s", "are", "some", "varargs3(5)\n"); MACRO("hello, world\n"); // MACRO("error\n", EMPTY); would cause C2059 }
- 追記
よくよく考えたら、上の使い方でMACROはいつも
#define TRACE printf
で代用してるから別にいいのか。
便利なのは
#define DEBUG_ERROR 3 #define DEBUG_WARNING 2 #define DEBUG_INFORMATION 1 #define DEBUG_LEVEL DEBUG_WARNING #define TRACE( x, ... ) if ( (x >= DEBUG_LEVEL) ) { printf(__VA_ARGS__); } ... TRACE( DEBUG_ERROR, "%s\n", errorMessage ); TRACE( DEBUG_INFORMATION, "%s\n", infoMessage );
みたいな使い方をするときにかな?