VC++与GCC预处理器

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__
Run Code Online (Sandbox Code Playgroud)

MACRO(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)

gcc输出:

head:1, tail:head:2, tail:3,4,5
Run Code Online (Sandbox Code Playgroud)

vc ++输出:

head:1, tail:head:2,3,4,5, tail:
Run Code Online (Sandbox Code Playgroud)

显然,aMACRO_OTHER2,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
Run Code Online (Sandbox Code Playgroud)

它基本上附加_argK每个参数.

例:

VA_TYPES_WITH_ARGS(int, bool, float)
Run Code Online (Sandbox Code Playgroud)

将扩大到

int _arg3, bool _arg2, float _arg1
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.


相关的预处理器问题:

gcc和Microsoft预处理器之间的区别

GCC和VC++预处理器的意外行为

chr*_*ris 3

您可以通过使用 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
Run Code Online (Sandbox Code Playgroud)

第一个宏ENUM在可变参数上枚举 (),为每个参数调用第二个宏并添加连接逗号。它从可变参数数据形成一个元组以提供给第二个宏。

第二种形式是元素 ( TUPLE_ELEM) 后跟_arg( CAT) 和size - n( SUB) 连接,其中size是可变参数数据中的元素数量(作为元组提供给宏) ( TUPLE_SIZE)。

看到它起作用了。