【发布时间】:2011-03-31 11:52:50
【问题描述】:
例如,BOOST_PP_ITERATE 和 BOOST_PP_ITERATION,如 GMan 的回答 here 所示,是没有任何参数的预处理器宏。没有(),它们不仅仅是简单的定义和使用,有什么原因吗?
【问题讨论】:
标签: c++ boost c-preprocessor boost-preprocessor
例如,BOOST_PP_ITERATE 和 BOOST_PP_ITERATION,如 GMan 的回答 here 所示,是没有任何参数的预处理器宏。没有(),它们不仅仅是简单的定义和使用,有什么原因吗?
【问题讨论】:
标签: c++ boost c-preprocessor boost-preprocessor
一般情况下,可以使用宏之类的功能来防止意外宏
扩展。
例如,假设我们有以下宏调用:
BOOST_PP_CAT( BOOST_PP_ITERATION, _DEPTH )
我们预计这将扩展为BOOST_PP_ITERATION_DEPTH。
但是,如果 BOOST_PP_ITERATION 是一个类似(非功能性)宏的对象,
它将在令牌之前扩展为自己的定义
BOOST_PP_ITERATION_DEPTH 由串联生成。
【讨论】:
BOOST_PP宏,例如BOOST_PP_EMPTY经常用于BOOST_PP_ENUM(NUM,MYMACRO,BOOST_PP_EMPTY)。
可能是因为它们执行操作:因此,它们的使用应该清楚地表明您实际上是在调用某些东西,而不仅仅是使用某个常量。
【讨论】:
BOOST_PP_ITERATE,但是BOOST_PP_ITERATION 呢?那只应该用作您当前的迭代深度,afaik。
BOOST_PP_ITERATION。好吧,我想基本原理很相似:因为BOOST_PP_ITERATION 的结果是可变的,所以让它看起来像一个返回值的函数是有意义的。当然,还有一致性。
BOOST_PP_IS_ITERATING 没有使用这个约定... :-s !