C++ 宏中的波浪线(~)是什么意思?

C++ 宏中的波浪线(~)是什么意思?,c++,c,c-preprocessor,tilde,C++,C,C Preprocessor,Tilde,如上所示,代码使用括号中的波浪号显示宏调用: HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)) // ^^^ 这意味着什么?我怀疑这只是一个空洞的论点,但我不确定。C(99)是否可能类似于 > VAY-AgsSux,具体到C99,存在于C++中?< /P> < P>。待测试的参数位于宏和括号之间,如果参数为空,则仅宏触发: _TRIGGER_PARENTHESIS_

如上所示,代码使用括号中的波浪号显示宏调用:

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

这意味着什么?我怀疑这只是一个空洞的论点,但我不确定。C(99)是否可能类似于 > VAY-AgsSux,具体到C99,存在于C++中?< /P> < P>。待测试的参数位于宏和括号之间,如果参数为空,则仅宏触发:

_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)

注意:实际上,你发布的链接就说明了这一点。我将检查标准中是否有此参考。

~
不起任何作用。这些括号内的几乎任何其他内容都会起到相同的作用


这个技巧的关键是测试
\u TRIGGER\u contractor\uuu(~)
\u TRIGGER\u contracts\uu参数(~)
的展开中是否紧靠
(~)
。无论哪种方式,
都有逗号(…)
在Boost的介绍页面上,将其参数扩展为
0
1
。预处理器的示例见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
#定义微型打印(z,n,数据)数据
#定义微小尺寸(z、n、未使用)\
模板\
结构微小尺寸<\
BOOST_PP_ENUM_参数(n,T)\
BOOST_PP_逗号_IF(n)\
BOOST_PP_ENUM(\
增强PP接头(微小最大尺寸,n),微小打印,无)\
>                                                             \
:mpl::int{};
重复(极小的最大尺寸,极小的尺寸,~)//哦!一块瓷砖!
#未定义的微小尺寸
#未定义的小字体
解释如下:

通过调用
BOOST\u PP\u REPEAT
,启动代码生成过程,这是一个高阶宏,重复调用由其第二个参数命名的宏(
TINY\u size
)。第一个参数指定重复调用的次数,第三个参数可以是任何数据;它会原封不动地传递给正在调用的宏。在本例中,
TINY\u size
不使用该数据,因此传递
~
的选择是任意的。[5]

(强调矿山)

还有一张便条:

[5]
~
并不是完全任意的选择。无论是代码< >代码> >代码> $< /Cord>可能是不错的选择,除了它们在技术上不是C++实现所需的基本字符集的一部分。像“忽略”这样的标识符可能会进行宏扩展,从而导致意外结果

因此,tilde只是一个占位符,因为需要参数,但不需要参数。因为任何用户定义的标识符都可以扩展,所以您需要使用其他东西


例如,与
+
-
相比,
~
几乎没有被使用过(二进制求反并不经常被调用),因此混淆的可能性很小。一旦你确定了这一点,不断地使用它会给瓷砖赋予新的意义;如使用<代码>运算符< /代码>代码运算符> <代码>,流数据已成为C++习语。在我看来,这只是一个占位符。我不认为它有什么特别的意义。在你的笔记上:是的,在我发帖后重读了几遍之后,它来到了我的面前。。。这不是我第一次问问题,几分钟后,我想到了答案…:(还有,你的第一句话似乎与问题没有直接关系。@Xeo:对不起,我恐怕没有完全理解上下文,无法给出详细的答案,关于为什么只有
~
,我一直在破坏标准,但没有成功。@Matthieu M.很好,找到了。不过,我可以睡个安稳觉!不管怎样,谢谢你的努力。:)我想知道这对于一个本身就是宏的论点会有什么影响<代码>\u触发器\u括号\uMyMacro(~)。为什么他使用
(~)
,而不是
(+)
或其他什么?@Johannes:Boost.Preprocessor简介页面提供了一个推理,我在下面引用了。目标是使用有效但罕见的预处理器令牌。My+1,这是一个非常好的发现!我找不到任何标准的参考资料&我在努力彻底理解它。你的回答很好。考虑到参数(因此,宏扩展参数)没有出现在微小尺寸的扩展中,宏扩展怎么可能导致意外的结果?@Random832:宏扩展对我来说总是有点模糊,但我认为例如
#定义未使用的a,b
,现在,
TINY_size
将被4个参数调用,而不是3个参数,因此代码将被拒绝。