Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.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++_Macros - Fatal编程技术网

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_宏相当的范围内修复它,但为时已晚,因为它仍然选择了错误的宏。我不敢相信解决办法这么简单。