宏中的波浪号(〜)是什么意思?

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 Horizo​​ntal 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++的习惯用语.