Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c预处理器中的宏计算_C_C Preprocessor - Fatal编程技术网

c预处理器中的宏计算

c预处理器中的宏计算,c,c-preprocessor,C,C Preprocessor,我想这样做: #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__) 我希望它的评估结果是“两个参数”。 但

我想这样做:

#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__)
我希望它的评估结果是“两个参数”。 但事实上我有

MYMACRONUM_ARGS()(1,1)
有没有一种方法可以实现我想要的(使用visual c++)

附言。 最后,我想实现一个转储所有变量的记录器。下一个代码

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

将生成日志记录“myInt=7;myStr=Hello Galaxy!”

您需要另一个宏,因为宏扩展不会在
附近进行:

#定义NUM_ARGS()2
#定义MYMACRO0(…)“无参数”
#定义MYMACRO1(…)“一个参数”
#定义MYMACRO2(…)“两个参数”
#定义MYMACRO_AUX(num,…)MYMACRO##num(u VA_ARGS_uu)
#定义MYMACRO(num,…)MYMACRO\u AUX(num,\uu VA\u ARGS)
#定义生成(…)MYMACRO(NUM_ARGS(),uu VA_ARGS_uu)
#包括
内部主(空)
{
puts(生成(0,1));
返回0;
}

如果这就是你想要做的,但复杂的预处理器技巧并不是真正安全的,正如其他人已经说过的,除非你真的必须这样做,否则不要这样做。

看看这个答案:你这样做是作为一个思维实验吗?你说你正在用VisualC++编写。宏是邪恶的,很难调试和跟踪(特别是当你开始写这样的东西时)。为什么不改用模板呢。我在一个产品上工作,这个产品有很多这样的功能,当我试图追溯到实际调用的函数时,这很痛苦。@pstrjds链锯是邪恶的,因为它会伤害你自己,你是绝对正确的。C@qrdl中没有模板-我知道C中没有模板。我只是问OP是否必须这样做。如果他们用Visual C++编译,也许他们实际上有C++代码,可以使用模板,而不是更干净。我不是说“不要”,我是说“如果你不是绝对必须的话,就不要”。在我工作的产品中,有人在传递给宏的值上犯了错误。没有进行类型检查,因为这是一个宏,一个bug被发布到需要几天才能跟踪的字段中(调用foo(&val)和foo(val)之间的细微差别,视觉上很难发现)。@qrdl-我想这更像是一场宗教辩论。我非常喜欢强输入,这是宏无法做到的。这就是说,如果你被困在C中,那么你没有模板和其他好东西,所以你使用你拥有的工具。
#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;
}