gpt4 book ai didi

c++ - 宏中的波浪号 (~) 是什么意思?

转载 作者:IT老高 更新时间:2023-10-28 12:32:29 26 4
gpt4 key购买 nike

见于 this site ,代码使用括号中的波浪号显示宏调用:

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

这是什么意思/做什么?我怀疑这只是一个空洞的论点,但我不确定。它是否可能特定于 C(99),例如 __VA_ARGS__ 特定于 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

解释如下:

The code generation process is kicked off by calling BOOST_PP_REPEAT, a higher-order macro that repeatedly invokes the macro named by its second argument (TINY_size). The first argument specifies the number of repeated invocations, and the third one can be any data; it is passed on unchanged to the macro being invoked. In this case, TINY_size doesn't use that data, so the choice to pass ~ was arbitrary. [5]

(强调我的)

还有注释:

[5] ~ is not an entirely arbitrary choice. Both @ and $ might have been good choices, except that they are technically not part of the basic character set that C++ implementations are required to support. An identifier like ignored might be subject to macro expansion, leading to unexpected results.

因此,波浪号只是一个占位符,因为需要一个参数,但没有一个参数是必需的。由于任何用户定义的标识符都可以扩展,因此您需要使用其他东西。

原来~+ 相比,几乎没有使用(二元否定并不经常被调用)或 -例如,因此混淆的可能性很小。一旦你确定了这一点,持续使用它会给波浪号赋予一个的含义;喜欢使用operator<<operator>> for 流式数据已成为 C++ 习语。

关于c++ - 宏中的波浪号 (~) 是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6478783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com