3

私はこのようなことをしたいと思います:

#define NUM_ARGS() 2
#define MYMACRO0(...) "no args"
#define MYMACRO1(...) "one arg"
#define MYMACRO2(...) "two args"
#define MYMACRO(num,...) MYMACRO##num(__VA_ARGS__)
#define GENERATE(...) MYMACRO(NUM_ARGS(),__VA_ARGS__)

そして、「2つの引数」に評価されると予想していました。しかし、代わりに私は持っています

MYMACRONUM_ARGS()(1,1)

(Visual C++ を使用して) 私がやりたいことを行う方法はありますか?

PS最終的には、すべての変数をダンプするロガーを実装したいと考えています。次のコード

int myInt = 7;
string myStr("Hello Galaxy!");
DUMP_VARS(myInt, myStr);

ログレコードを生成します"myInt = 7; myStr = Hello Galaxy!"

4

1 に答える 1

6

#またはの近くではマクロ展開が行われないため、別のマクロが必要です##

#define NUM_ARGS() 2
#define MYMACRO0(...) "no args"
#define MYMACRO1(...) "one arg"
#define MYMACRO2(...) "two args"
#define MYMACRO_AUX(num,...) MYMACRO##num(__VA_ARGS__)
#define MYMACRO(num,...) MYMACRO_AUX(num, __VA_ARGS__)
#define GENERATE(...) MYMACRO(NUM_ARGS(),__VA_ARGS__)

#include <stdio.h>

int main(void)
{
    puts(GENERATE(0, 1));

    return 0;
}

これがあなたがやろうとしていることであるが、他の人がすでに言ったように、複雑なプリプロセッサのトリックは本当に安全ではない場合は、本当に必要でない限りそれをしないでください.

于 2012-12-20T11:12:49.563 に答える