在这个网站上看到,代码使用圆括号中的波浪线表示宏调用:
HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
// ^^^
这是什么意思/作用?我怀疑它只是一个空参数,但我不确定。它是否可能是C(99)特有的,就像__VA_ARGS__
是C99特有的且存在于C++中一样?
在这个网站上看到,代码使用圆括号中的波浪线表示宏调用:
HAS_COMMA(_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~))
// ^^^
这是什么意思/作用?我怀疑它只是一个空参数,但我不确定。它是否可能是C(99)特有的,就像__VA_ARGS__
是C99特有的且存在于C++中一样?
#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
#define unused a, b
为例,现在TINY_size
将被调用4个参数,而不是3个,因此代码将被拒绝。 - Matthieu M.~
没有任何作用。 几乎任何其他括号内的内容都可以起到同样的作用。
这个技巧的关键是测试是否在 _TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)
的展开中,_TRIGGER_PARENTHESIS_
紧挨着 (~)
。无论哪种情况,HAS_COMMA(...)
都会将其参数展开为 0
或 1
。
_TRIGGER_PARENTHESIS_ MYMACRO(〜)
。 - Xeo(~)
而不是(+)
或其他什么符号? - Johannes Schaub - litb_TRIGGER_PARENTHESIS_ __VA_ARGS__ (~)
~
而且我一直在长时间地破坏标准却没有成功。不过,@Matthieu M. 的发现很棒,我可以安心睡觉了! - Alok Save