【发布时间】:2021-12-13 20:43:59
【问题描述】:
我有以下宏:
#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 和任务)。
【问题讨论】:
-
是否有理由将它们保留为宏,而不是从中制作适当的函数(或函数模板)?
-
@TedLyngmo 唯一的要求是:HEX 是传递给编译器的编译定义。 BITS 不需要是宏,但值取决于编译定义。数组以 const 结构结束。
-
您能否展示目标结构以及您希望如何使用宏?它有助于了解最终结果应该是什么。我看到 Staz 在下面做了一个非宏观的回答。如果这不起作用,您能否在该答案下发表评论并描述它不起作用的方式?