vim*_*vim 7 c++ macros gcc visual-c++ c-preprocessor
长话短说,gcc和vc ++预处理器具有相同输入的不同输出.如果传递给另一个宏,vc ++中的变量宏似乎不会进行"参数匹配"(如果它是正确的术语).例如:
#define MACRO(a, ...)        head:a, tail:MACRO_OTHER(__VA_ARGS__)
#define MACRO_OTHER(a, ...)  head:a, tail:__VA_ARGS__
同
MACRO(1, 2, 3, 4, 5)
gcc输出:
head:1, tail:head:2, tail:3,4,5
vc ++输出:
head:1, tail:head:2,3,4,5, tail:
显然,a在MACRO_OTHER是2,3,4,5与空可变参数部分.考虑到这一点,有没有办法创建一个vc ++替代以下的宏(这与gcc很好)
#define VA_TYPES_WITH_ARGS(...) __VA_TYPES_WITH_ARGS(VA_NUM_ARGS(__VA_ARGS__),##__VA_ARGS__)
#define __VA_TYPES_WITH_ARGS(n, ...) _VA_TYPES_WITH_ARGS(n,##__VA_ARGS__)
#define _VA_TYPES_WITH_ARGS(n, ...) _VA_TYPES_WITH_ARGS_##n(__VA_ARGS__)
#define _VA_TYPES_WITH_ARGS_0()
#define _VA_TYPES_WITH_ARGS_1(type     ) type _arg1
#define _VA_TYPES_WITH_ARGS_2(type, ...) type _arg2, _VA_TYPES_WITH_ARGS_1(__VA_ARGS__)
#define _VA_TYPES_WITH_ARGS_3(type, ...) type _arg3, _VA_TYPES_WITH_ARGS_2(__VA_ARGS__)
// etc
它基本上附加_argK每个参数.
例:
VA_TYPES_WITH_ARGS(int, bool, float)
将扩大到
int _arg3, bool _arg2, float _arg1
任何帮助将不胜感激.
相关的预处理器问题:
您可以通过使用 Boost 以合理的交叉编译器方式(并接受更多参数,无需额外的工作来启动)来完成此操作,我可以告诉您,通过花费大量时间查看标头,Boost 有许多解决方法诸如此类的问题:
#define VA_TYPES_WITH_ARGS(...)   \
    BOOST_PP_ENUM(                \
        BOOST_PP_VARIADIC_SIZE(__VA_ARGS__),    \
        VA_TYPES_WITH_ARGS_MACRO,               \
        BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__) \
    )
#define VA_TYPES_WITH_ARGS_MACRO(z, n, data)       \
    BOOST_PP_TUPLE_ELEM(n, data) BOOST_PP_CAT(     \
        _arg,                                      \
        BOOST_PP_SUB(BOOST_PP_TUPLE_SIZE(data), n) \
    )                                              
VA_TYPES_WITH_ARGS(int, bool, float) //int _arg3 , bool _arg2 , float _arg1
第一个宏ENUM在可变参数上枚举 (),为每个参数调用第二个宏并添加连接逗号。它从可变参数数据形成一个元组以提供给第二个宏。
第二种形式是元素 ( TUPLE_ELEM) 后跟_arg( CAT) 和size - n( SUB) 连接,其中size是可变参数数据中的元素数量(作为元组提供给宏) ( TUPLE_SIZE)。
| 归档时间: | 
 | 
| 查看次数: | 632 次 | 
| 最近记录: |