重复生成宏

时间:2018-08-02 16:19:53

标签: c++ boost boost-preprocessor

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

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

小时从0更改为23

BOOST_PP_LOCAL_LIMITS / ITERATE可以吗?

1 个答案:

答案 0 :(得分:3)

是的

#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")不起作用,我们必须将令牌域然后中的所有内容连接起来,然后进行字符串化。