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(...)
将其参数展开为0
或1
。
要testing的参数放在macros和它的括号之间,macros只在参数为空时触发:
_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)
注意:其实你发布的链接说明。 我将在标准中检查这个参考。