宏如果在里面?

时间:2013-11-16 20:23:54

标签: c++ visual-studio-2010 c-preprocessor

有可能做这样的事吗?看看这段代码:

#define MyMacro(...) SomeFunction(arg1, arg2, arg3)

现在,我希望有条件地编译第二个参数:

#define MyMacro(...) SomeFunction(arg1,
#if CONDITION
    arg2,
#endif
    arg3)

这实际上没有编译,但它显示了我想要实现的目标 - 当CONDITION满足时,我希望MyMacro使用SomeFunction的3参数版本和2参数1否则。

当然,在这里我可以只显式地编写两个函数调用但在我的程序中我实际上有3个“条件”参数,这将给我8个组合。

2 个答案:

答案 0 :(得分:2)

#if CONDITION
#define ARG2 arg2,
#else
#define ARG2
#endif

#define MyMacro(...) SomeFunction(arg1, ARG2 arg3)

答案 1 :(得分:1)

查看boost :: preprocessor了解更多详情

这个想法如下:

#include <iostream>

#define SELECT0(ARG1, ARG2) ARG1
#define SELECT1(ARG1, ARG2) ARG2
#define SELECT(COND_0_OR_1, ARG1, ARG2) SELECT##COND_0_OR_1(ARG1, ARG2)

const char * s = 
SELECT(0, "arg1", "arg2");

int main(void) {

  std::cout<<s;  
  return 0;
}