Xeo*_*Xeo 37 c c++ tilde c-preprocessor
在此站点上看到,代码显示了使用括号中的波浪号进行的宏调用:
HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
// ^^^
Run Code Online (Sandbox Code Playgroud)
它是什么意思/做什么?我怀疑它只是一个空洞的争论,但我不确定.它是否特定于C(99),就像__VA_ARGS__C99特有的并且存在于C++中一样?
Mat*_* M. 31
在Boost.Preprocessor的介绍页面上,A.4.1.1 Horizontal Repetition中给出了一个例子
#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
Run Code Online (Sandbox Code Playgroud)
解释如下:
代码生成过程通过调用
BOOST_PP_REPEAT一个高阶宏来启动,该宏重复调用由其第二个参数(TINY_size)命名的宏.第一个参数指定重复调用的次数,第三个参数可以是任何数据; 它被传递给未被调用的宏.在这种情况下,TINY_size不使用该数据,因此传递的选择~是任意的.[5]
(强调我的)
还有一个说明:
[5]~并非完全武断的选择.双方@并$可能是不错的选择,但他们在技术上不是基本字符集的一部分是C++的实现都必须支持.像被忽略的标识符可能会受到宏扩展的影响,从而导致意外的结果.
因此,波浪号只是一个占位符,因为需要参数,但没有必要.由于任何用户定义的标识符都可以扩展,因此您需要使用其他内容.
事实证明,~几乎是未使用的(二进制的否定是不是经常被称为)相比,+或-例如,所以混乱的机会不大.一旦你确定了这一点,一直使用它会给代字号带来新的意义; 喜欢使用operator<<和operator>>流式传输数据已成为C++的习惯用语.
| 归档时间: |
|
| 查看次数: |
2977 次 |
| 最近记录: |