gpt4 book ai didi

c++ - VC++ 与 GCC 预处理器

转载 作者:可可西里 更新时间:2023-11-01 18:35:44 24 4
gpt4 key购买 nike

长话短说,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:

显然 MACRO_OTHER 中的 a2,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

任何帮助将不胜感激。


相关预处理器问题:

Difference between gcc and Microsoft preprocessor

Unexpected Behaviour of GCC and VC++ Preprocessor

最佳答案

您可以通过使用 Boost 以一种合理的交叉编译器方式(并接受更多参数而无需额外的工作来启动)来完成此操作,我可以告诉您,通过花费大量时间查看 header ,它有很多解决方法解决诸如此类的问题:

#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)。

See it work.

关于c++ - VC++ 与 GCC 预处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24894769/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com