読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

こんなんが欲しかった!?

備忘録 プログラム C++ C言語

東方算程譚:こんなんアリかよで知った。


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 );

みたいな使い方をするときにかな?