c 语言内有 逗号,C / C ++宏中的逗号

因为尖括号也可以代表(或发生在)比较运算符,<=和>=,宏扩展不能像它括号内确实忽略角括号内的逗号。(对于方括号和大括号,这也是一个问题,即使它们通常作为平衡对出现。)您可以将宏参数括在括号中:

FOO((std::map), map_var);

问题是该参数在宏扩展中保持括号,这可以防止在大多数上下文中将其作为类型读取。

解决此问题的一个很好的技巧是在C ++中,您可以使用函数类型从带括号的类型名称中提取类型名称:

template struct argument_type;

template struct argument_type { typedef U type; };

#define FOO(t,name) argument_type::type name

FOO((std::map), map_var);

因为形成函数类型忽略了额外的括号,所以您可以使用带有或不带括号的宏,其中类型名称不包含逗号:

FOO((int), int_var);

FOO(int, int_var2);

当然,在C语言中,这不是必需的,因为类型名称不能包含括号外的逗号。因此,对于跨语言宏,您可以编写:

#ifdef __cplusplus__

template struct argument_type;

template struct argument_type { typedef U type; };

#define FOO(t,name) argument_type::type name

#else

#define FOO(t,name) t name

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值