我试图通过参数的数量来重载宏。
当然,我实际上不能重载宏。
我试过使用可变参数宏来选择正确的宏(使用如果__VA_ARGS__
不存在它应该删除它之前的最后一个逗号的事实 - GCC参考):
#define TEST1() printf("TEST1");
#define TEST2() printf("TEST2");
#define CHOOSER(x, y,FUNC,...) FUNC()
#define MANIMACRO(...) CHOOSER(,__VA_ARGS__,TEST1,TEST2)
int main(void)
{
MANIMACRO(1);
MANIMACRO();
}
这个想法是,如果__VA_ARGS__
存在,它应该将 4 个参数传递给CHOOSER,其中第三个参数应该与未使用的参数一起“消失”。所以会选择 TEST1。
如果没有参数,则该参数__VA_ARGS__
将为空,并且应该已删除昏迷,因此将选择并使用TEST2 。
所以,我想这不起作用,因为__VA_ARGS__
可能仅在预处理阶段结束时才被删除,在整个事情已经扩展之后。
那么,我该怎么做呢?(在 vs2010 中)