gpt4 book ai didi

c - "Unpacking"宏参数

转载 作者:行者123 更新时间:2023-12-04 14:01:53 29 4
gpt4 key购买 nike

我有以下宏:

#define HEX 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

#define BITS 0x01

#define ADD_FLAGS(a, b, c, d, e, f, g, h) \
a, b | BITS, c, d, e, f, g, h

我在某处使用它来创建一个字节数组 {ADD_FLAGS(HEX)}。这是行不通的。 HEX 被解释为 ADD_FLAGS 的单个参数,我收到参数太少的错误。

const myStructure Table[ENTRY_COUNT] =                   
{
/* Entity Index 0 */
{
<some structure fields>,
ADD_FLAGS(HEX), // 8-byte array
<more structure fields>
}
}

我也尝试了以下变体,但没有成功:

#define EXPAND(x) x
#define ADD_FL(a, b, c, d, e, f, g, h) \
a, b | BITS, c, d, e, f, g, h
#define ADD_FLAGS(...) ADD_FL EXPAND((__VA_ARGS__))

##################### other variant
#define ADD_FLAGS(...) EXPAND(ADD_FL (__VA_ARGS__))

我使用的是 C99 和三种不同的编译器,因此任何答案都必须符合标准,否则肯定会有一个编译器无法正常工作(我使用的是 armclang、ghs 和 tasking)。

最佳答案

抛开强制性的“避免宏”,您只需要将 ADD_FLAGS 包装在另一个宏中即可。

将其重命名为其他名称,例如ADD_FLAGS_,并添加

#define ADD_FLAGS(...) ADD_FLAGS_(__VA_ARGS__)

这适用于 GCC 和 Clang。在 MSVC 中,这仅适用于新的预处理器(/Zc:preprocessor 标志)。

不确定如何使用旧的 MSVC 预处理器来完成它,但由于它是出了名的错误,我会尽可能避免支持它。

关于c - "Unpacking"宏参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69757614/

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