首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除带宏的括号?

如何删除带宏的括号?
EN

Stack Overflow用户
提问于 2014-06-30 01:17:19
回答 4查看 8.1K关注 0票数 20

宏参数中不允许逗号,因为它将被视为多个参数,并且预处理将是错误的。但是,我们可以插入参数以让预处理器将其作为一个参数来处理。是否有可以删除括号的宏或其他技术?

例如,如果我定义一个宏,如

代码语言:javascript
复制
#define MY_MACRO(a, b)   ...

然后把它当作

代码语言:javascript
复制
MY_MACRO( A<int, double>, text );

都是错的。用它就像

代码语言:javascript
复制
MY_MACRO( (A<int, double>), text)

如果使用宏或技术来删除括号,就可以了。Boost只为类型而不是一般情况提供BOOST_IDENTITY_TYPE

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-06-30 01:22:51

代码语言:javascript
复制
#define ESC(...) __VA_ARGS__

然后

代码语言:javascript
复制
MY_MACRO( ESC(A<int, double>), text );

可能做你想做的事。

票数 21
EN

Stack Overflow用户

发布于 2015-12-09 15:20:00

这个宏技巧类似于Yakk的解决方案,但不需要显式地将另一个宏作为参数传递。

代码语言:javascript
复制
#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宏变成一个多样化的宏并传递多个参数包来获得创造性。

票数 12
EN

Stack Overflow用户

发布于 2020-07-19 19:09:07

只有可能删除括号:

如果您需要去掉一层括号,但只有在有圆括号的情况下,这组较长的宏才能做到这一点:

代码语言:javascript
复制
#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,则可能需要这样做:

代码语言:javascript
复制
#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,无括号。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24481810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档