宏参数中不允许逗号,因为它将被视为多个参数,并且预处理将是错误的。但是,我们可以插入参数以让预处理器将其作为一个参数来处理。是否有可以删除括号的宏或其他技术?
例如,如果我定义一个宏,如
#define MY_MACRO(a, b) ...然后把它当作
MY_MACRO( A<int, double>, text );都是错的。用它就像
MY_MACRO( (A<int, double>), text)如果使用宏或技术来删除括号,就可以了。Boost只为类型而不是一般情况提供BOOST_IDENTITY_TYPE宏
发布于 2014-06-30 01:22:51
#define ESC(...) __VA_ARGS__然后
MY_MACRO( ESC(A<int, double>), text );可能做你想做的事。
发布于 2015-12-09 15:20:00
这个宏技巧类似于Yakk的解决方案,但不需要显式地将另一个宏作为参数传递。
#include <stdio.h>
#define _Args(...) __VA_ARGS__
#define STRIP_PARENS(X) X
#define PASS_PARAMETERS(X) STRIP_PARENS( _Args X )
int main()
{
printf("without macro %d %d %d %d %d %d\n", (5,6,7,8,9,10) ); // This actually compiles, but it's WRONG
printf("with macro %d %d %d %d %d %d\n", PASS_PARAMETERS((5,6,7,8,9,10)) ); //Parameter "pack" enclosed in parenthesis
return 0;
}当然,您可以通过将PASS_PARAMETERS宏变成一个多样化的宏并传递多个参数包来获得创造性。
发布于 2020-07-19 19:09:07
只有可能删除括号:
如果您需要去掉一层括号,但只有在有圆括号的情况下,这组较长的宏才能做到这一点:
#define DEPAREN(X) ESC(ISH X)
#define ISH(...) ISH __VA_ARGS__
#define ESC(...) ESC_(__VA_ARGS__)
#define ESC_(...) VAN ## __VA_ARGS__
#define VANISH如果您希望对不同的数据类型集使用MY_MACRO,则可能需要这样做:
#define MY_MACRO(a, b) DEPAREN(a), b
MY_MACRO( ({x, y, z}), text )
//> {x,y,z}, text
MY_MACRO( singlearg, text )
//> singlearg, text它的工作原理:
我们从DEPAREN(X) ESC(ISH X)开始。如果X有括号,我们得到ESC(ISH(X))。如果X没有括号,我们得到ESC(ISH X)。
然后我们将ESC(...)展开为ESC_(__VA_ARGS__),它扩展了内部。
ISH(...)变成了ISH __VA_ARGS__,它从X中去掉一层括号,现在,不管X最初是否有括号,我们都有ESC_(ISH X)。
我们现在需要摆脱ISH。但是,因为我们已经定义了ISH(...),所以不能将它定义为#define ISH。这就是为什么我们将它与另一个令牌(VAN)连接起来以获得VANISH X。
VANISH被定义为,因此我们最终使用了X,无括号。
https://stackoverflow.com/questions/24481810
复制相似问题