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

| 在此站点上看到的代码在括号中使用代字号显示了宏调用:
HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
//                                          ^^^
这是什么意思/做什么?我怀疑这只是一个空洞的论点,但我不确定。它可能是特定于C(99)的,就像ѭ1特定于C99并存在于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
开始代码生成过程,ѭ3是一个高阶宏,它反复调用由其第二个参数(
TINY_size
)命名的宏。第一个参数指定重复调用的次数,第三个参数可以是任何数据。它将原样传递给正在调用的宏。在这种情况下,
TINY_size
不使用该数据,因此传递
~
的选择是任意的。 [5] (强调我的) 还有注意事项:   
[5]
6并不是一个完全任意的选择。
@
$
可能都是不错的选择,但从技术上讲,它们不是C ++实现必须支持的基本字符集的一部分。像被忽略的标识符可能会进行宏扩展,从而导致意外结果。 因此,代字号只是一个占位符,因为需要一个参数,但没有必要。由于想要扩展任何用户定义的标识符,因此您需要使用其他名称。 事实证明,与
+
-
相比,
~
几乎没有被使用(二元否定通常不被称为),因此混淆的可能性很小。一旦解决了这个问题,便始终如一地使用它可以为波浪号赋予新的含义。例如使用
operator<<
operator>>
进行流数据传输已成为C ++习惯用法。     
        
~
什么也不做。这些括号内的几乎所有其他内容都一样。 此技巧的关键在于测试
_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)
的扩展中
_TRIGGER_PARENTHESIS_
是否紧挨
(~)
。无论哪种方式,
HAS_COMMA(...)
都会将其参数扩展为
0
1
。     
        要测试的参数放在宏及其括号之间,只有在参数为空时,宏才会触发:
_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)
注意:实际上,您发布的链接非常清楚。我将在标准中检查对此的引用。     

要回复问题请先登录注册