macros中的代字符(〜)是什么意思?

在这个网站上看到的代码显示了在括号中使用波浪号的macros调用:

HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)) // ^^^ 

这是什么意思? 我怀疑这只是一个空洞的说法,但我不确定。 C(99)可能特定于__VA_ARGS__特定于C99 __VA_ARGS__在于C ++中吗?

在Boost.Preprocessor的介绍页面上, A.4.1.1横向重复给出了一个例子

 #define TINY_print(z, n, data) data #define TINY_size(z, n, unused) \ template <BOOST_PP_ENUM_PARAMS(n, class T)> \ struct tiny_size< \ BOOST_PP_ENUM_PARAMS(n,T) \ BOOST_PP_COMMA_IF(n) \ BOOST_PP_ENUM( \ BOOST_PP_SUB(TINY_MAX_SIZE,n), TINY_print, none) \ > \ : mpl::int_<n> {}; BOOST_PP_REPEAT(TINY_MAX_SIZE, TINY_size, ~) // Oh! a tilde! #undef TINY_size #undef TINY_print 

解释如下:

通过调用BOOST_PP_REPEAT来启动代码生成过程, BOOST_PP_REPEAT是一个反复调用由其第二个参数( TINY_size )命名的macros的高阶macros。 第一个参数指定重复调用的次数,第三个参数可以是任何数据; 它不变地传递给被调用的macros。 在这种情况下, TINY_size不使用这些数据,所以select传递~是任意的。 [5]

(重点是我的)

还有一个提示:

[5] ~不是完全任意的select。 @$可能是很好的select,只不过它们在技术上不是C ++实现必须支持的基本字符集的一部分。 像忽略的标识符可能会受到macros扩展,导致意想不到的结果。

因此,代字号仅仅是一个占位符,因为需要一个参数,但没有必要。 由于任何用户定义的标识符可以扩展,你需要使用别的东西。

事实certificate,相对于+-~几乎没有被使用(二元否定并不经常被称为),所以几乎没有混淆的可能性。 一旦你解决了这个问题,使用它一直给它代替新的含义; 像使用operator<<operator>>来处理stream数据已经成为一种C ++习惯用法。

~什么都不做。 这些圆括号内的其他内容几乎都是一样的。

这个技巧的关键是在_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)的扩展中testing_TRIGGER_PARENTHESIS_是否在(~)旁边。 无论哪种方式, HAS_COMMA(...)将其参数展开为01

要testing的参数放在macros和它的括号之间,macros只在参数为空时触发:

 _TRIGGER_PARENTHESIS_ __VA_ARGS__ (~) 

注意:其实你发布的链接说明。 我将在标准中检查这个参考。

Interesting Posts