c++;宏重载不起作用 我试图根据参数的数量来重载C++预处理器宏..
例如,我想这样做:c++;宏重载不起作用 我试图根据参数的数量来重载C++预处理器宏.. ,c++,macros,C++,Macros,例如,我想这样做: FOO(1, 2, 3) //==> expandsto FOO3(1,2,3) FOO(1, 2) //==> expandsto FOO2(1,2) 这就是我所做的: #define GET_MACRO(_1,_2,_3,NAME,...) NAME #define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__) #define FOO2(A, B) std::cou
FOO(1, 2, 3) //==> expandsto FOO3(1,2,3)
FOO(1, 2) //==> expandsto FOO2(1,2)
这就是我所做的:
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__)
#define FOO2(A, B) std::cout<<"2 arguments"<<std::endl;
#define FOO3(A, B, C) std::cout<<"3 arguments"<<std::endl;
int main() {
FOO(1,2,3)
return 0;
}
我做错了什么
更新:
事实上,我意识到这在Ideone>>>链接上有效看起来像是VisualStudio的bug,你的代码是有效的(我可以用GCC编译)。但无论如何,这是一种糟糕的风格
#define FOO2(A, B) std::cout<<"2 arguments"<<std::endl; // add `do {...} while (0)` construction
#define FOO3(A, B, C) std::cout<<"3 arguments"<<std::endl;
int main() {
FOO(1,2,3) // Put `;` here
return 0;
}
#define FOO2(A,B)std::cout看起来像是Visual studio的bug,您的代码是有效的(我可以用GCC编译)。但无论如何,这是一种糟糕的风格
#define FOO2(A, B) std::cout<<"2 arguments"<<std::endl; // add `do {...} while (0)` construction
#define FOO3(A, B, C) std::cout<<"3 arguments"<<std::endl;
int main() {
FOO(1,2,3) // Put `;` here
return 0;
}
#define FOO2(A,B)std::cout这是的VC++bug
试试这个
#define ID(x) x
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) ID(GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__))
这是\uu VA\u ARGS\uu
试试这个
#define ID(x) x
#define GET_MACRO(_1,_2,_3,NAME,...) NAME
#define FOO(...) ID(GET_MACRO(__VA_ARGS__, FOO3, FOO2)(__VA_ARGS__))
你是否尝试运行预处理器单独查看刚刚处理的文本输出?你是指VisualStudio 2012还是Visual C++ 12?或者你真的是指Visual Studio 12.xx,它以“Visual Studio 2013”的名义出售?我不知道这是否是你的问题,但我知道当前的VC++预处理器不一致,因此,从使用复杂预处理器逻辑的其他平台移植的源代码经常中断。请避免使用复杂的预处理器。然后,您可以在编译器和类型安全的全部权限中生存。您尝试单独运行预处理器来查看已处理的文本输出吗?您是指VisualStudio 2012还是Visual C++ 12?或者你真的是指Visual Studio 12.xx,它以“Visual Studio 2013”的名义出售?我不知道这是否是你的问题,但我知道当前的VC++预处理器不一致,因此,从使用复杂预处理器逻辑的其他平台移植的源代码经常中断。请避免使用复杂的预处理器。然后你就可以享受编译器和类型安全的全部功能了代码>在这样的表达式中;你不想鼓励FOO(1,2,3)不要省略尾随代码>在这样的表达式中;你不想鼓励FOO(1,2,3)太感谢你了,这让我发疯,因为我试图在我的GET_宏中修复它,这太晚了,因为它仍然选择了错误的宏。我不敢相信解决方法如此简单。非常感谢,这让我发疯,因为我试图在与GET_宏相当的范围内修复它,但为时已晚,因为它仍然选择了错误的宏。我不敢相信解决办法这么简单。