【问题标题】:Repeat generation of macro重复生成宏
【发布时间】:2018-08-02 16:19:52
【问题描述】:

我想生成以下预处理器编译指示

#pragma blabla column("0030")
#pragma blabla column("0130")
#pragma blabla column("0230")
...
#pragma blabla column("2330")

小时从 0 变为 23

BOOST_PP_LOCAL_LIMITS/ITERATE 可以吗?

【问题讨论】:

    标签: c++ boost boost-preprocessor


    【解决方案1】:

    是的。

    #include <boost/preprocessor/repeat.hpp>
    #include <boost/preprocessor/stringize.hpp>
    #include <boost/preprocessor/control/if.hpp>
    #include <boost/preprocessor/comparison/greater.hpp>
    
    #define blabla(z, n, data)                          \
        _Pragma(BOOST_PP_STRINGIZE(                     \
            blabla column(                              \
                BOOST_PP_STRINGIZE(                     \
                    BOOST_PP_CAT(                       \
                        BOOST_PP_CAT(                   \
                            BOOST_PP_IF(                \
                                BOOST_PP_GREATER(n, 9), \
                                ,                       \
                                0                       \
                            ),                          \
                            n                           \
                        ),                              \
                        30                              \
                    )                                   \
                )                                       \
            )                                           \
        ))
    
    BOOST_PP_REPEAT(24, blabla, ~)
    

    _Pragma 将我们保存在那里,因为无法生成诸如 #pragma 之类的预处理器指令,但是它非常对它接受的内容很挑剔。特别是,它不做字符串连接,所以_Pragma("some" "thing") 不起作用,我们必须在token-land 中连接所有内容然后 stringize 作为最后一步。

    【讨论】:

    • _Pragma 来自哪里?便携吗?
    • @sehe 它就在那里since C++11,正是为了解决从/内部宏生成编译指示的问题。
    • c++20会对此有什么影响吗?一般在 Boost.PP 上?
    • @MMM 我真的不知道,不过我还没有在 C++20 中看到很多面向预处理器的功能。
    猜你喜欢
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-12-12
    • 2015-05-07
    相关资源
    最近更新 更多