【问题标题】:Rationale on Boost.Preprocessor using macros instead of simple defines?Boost.Preprocessor 使用宏而不是简单定义的基本原理?
【发布时间】:2011-03-31 11:52:50
【问题描述】:

例如,BOOST_PP_ITERATEBOOST_PP_ITERATION,如 GMan 的回答 here 所示,是没有任何参数的预处理器宏。没有(),它们不仅仅是简单的定义和使用,有什么原因吗?

【问题讨论】:

    标签: c++ boost c-preprocessor boost-preprocessor


    【解决方案1】:

    一般情况下,可以使用宏之类的功能来防止意外宏 扩展。
    例如,假设我们有以下宏调用:

    BOOST_PP_CAT( BOOST_PP_ITERATION, _DEPTH )
    

    我们预计这将扩展为BOOST_PP_ITERATION_DEPTH
    但是,如果 BOOST_PP_ITERATION 是一个类似(非功能性)宏的对象, 它将在令牌之前扩展为自己的定义 BOOST_PP_ITERATION_DEPTH 由串联生成。

    【讨论】:

    • 这似乎是它,bot不仅用于连接,还可以将这些宏传递给其他BOOST_PP宏,例如BOOST_PP_EMPTY经常用于BOOST_PP_ENUM(NUM,MYMACRO,BOOST_PP_EMPTY)
    【解决方案2】:

    可能是因为它们执行操作:因此,它们的使用应该清楚地表明您实际上是在调用某些东西,而不仅仅是使用某个常量。

    【讨论】:

    • 好的,这可能适用于BOOST_PP_ITERATE,但是BOOST_PP_ITERATION 呢?那只应该用作您当前的迭代深度,afaik。
    • 哦,我没注意到你提到了BOOST_PP_ITERATION。好吧,我想基本原理很相似:因为BOOST_PP_ITERATION 的结果是可变的,所以让它看起来像一个返回值的函数是有意义的。当然,还有一致性。
    • 但是现在我看到BOOST_PP_IS_ITERATING 没有使用这个约定... :-s !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 2012-07-21
    • 2016-02-02
    相关资源
    最近更新 更多