C++;具有可变参数数的宏 我想知道如何创建一个C++宏,它可以在给定数量的参数之间生成一个或多个,比如 #define aMacro(arg1,arg2,arg3,arg4) arg1==arg2 || arg1==arg3 || arg1==arg4

C++;具有可变参数数的宏 我想知道如何创建一个C++宏,它可以在给定数量的参数之间生成一个或多个,比如 #define aMacro(arg1,arg2,arg3,arg4) arg1==arg2 || arg1==arg3 || arg1==arg4,c++,macros,C++,Macros,但是有很多不同的论点 我知道varadic宏,我知道它们存在,我知道关于它有一些问题,但据我所知,没有一个解决了我关于如何做| |部分的问题 感谢您,您正在寻找的是可变宏: 可变宏是某些计算机编程语言的一个特征, 特别是C预处理器,通过它可以将宏声明为 接受不同数量的参数 可变参数宏是1999年在ISO/IEC中引入的 9899:1999(C99)修订了C语言标准,并于2011年 ISO/IEC 1488∶2011(C++ 11)修订C++语言标准 因此它在C++11或C99中可用。它在某些编译

但是有很多不同的论点

我知道varadic宏,我知道它们存在,我知道关于它有一些问题,但据我所知,没有一个解决了我关于如何做| |部分的问题

感谢您,您正在寻找的是可变宏:

可变宏是某些计算机编程语言的一个特征, 特别是C预处理器,通过它可以将宏声明为 接受不同数量的参数

可变参数宏是1999年在ISO/IEC中引入的 9899:1999(C99)修订了C语言标准,并于2011年 ISO/IEC 1488∶2011(C++ 11)修订C++语言标准 因此它在C++11或C99中可用。它在某些编译器上也可以作为en扩展,例如gnugcc支持它,我想我也读过VC++

然后看看post的语法示例,它给出了一个简单的示例:

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

希望你能在这里找到一个比宏优越得多的替代品,也许你还不知道。这使用了,这需要C++11。但是如果你想要可变宏,也需要C++11

template<typename T>
bool func(T const&)
{
    return false;
}

template<typename L, typename R, typename... Args>
bool func(L const& lhs, R const &rhs, Args const&... args)
{
    return (lhs == rhs) || func(lhs,args...);
}
模板
布尔函数(T常数&)
{
返回false;
}
模板
布尔函数(左常量和左常量、右常量和右常量、参数常量和…参数)
{
返回(lhs==rhs)| | func(lhs,args…);
}

不幸的是,他不想调用
printf()
;他希望生成代码,依次将第一个参数与其余每个参数进行比较。你还没有演示如何做。这正是我的问题,我知道如何制作一个变量宏,对我来说最困难的部分是如何制作或像我提到的那样。我仍然不知道如何制作,你能给我一个如何制作的例子吗?#定义FOO(HEAD)HEAD#定义FOO(HEAD…)HEAD | | FOO(##VA#u ARGS)宏不是那样工作的。
FOO
的第二个定义破坏了第一个定义。请注意,C++11支持带有
\uu VA\u ARGS\uu
的可变宏。另请参见,以了解处理变量数量上的循环的方法。还要注意的是,为了安全起见,问题中的宏主体应该是
((arg1)==(arg2)| |(arg1)==(arg3)| |(arg1)==(arg4))
,否则您很容易被完全破坏代码含义的奇数表达式调用。在宏展开中插入每个参数(直到您知道什么时候不是100%必要)。提示:如果需要,请尽量避免使用宏can@SingerOfTheFall这不是重复的,因为你提到的帖子没有说明如何制作或部分。@claptrap为什么我要避免它?我认为在这种情况下,它会让我的代码更可读,因为它将取代我代码中多次出现的一个非常冗长的表达式。@ MPPL,因为在C++中,当你有内联函数等时,没有理由使用宏来处理。如果您不需要编写带有条件编译的可移植代码,那么就可以避免。您需要提到C++11吗?我想你需要解释一下。。。注释。他想要的是
|
,而不是
&
。据我所知,即使不使用c++11,varadic宏也有一些主要编译器的支持。。。在不使用c++11的情况下,这个varadic模板支持吗?据我所知不支持。