C - "Unpacking" 宏参数

  • 本文关键字:参数 Unpacking c c99
  • 更新时间 :
  • 英文 :


我有以下宏:

#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, li和tasking)。

强制性"避免宏观";除此之外,您只需要将ADD_FLAGS封装在另一个宏中。

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

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

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

不确定如何使用旧的MSVC预处理器,但由于它众所周知的错误,我尽量避免支持它。

我建议您谨慎使用宏。下面是一个示例代码片段,它完全完成了宏所做的工作,但在我看来它更合理一些。

template<typename ... Ts>
constexpr auto add_flags(Ts && ... args){
std::array flags{std::forward<Ts>(args)...};
constexpr int bits = 0x01;
// flags[some_idx] |= bits;
return flags;
}

相关内容

  • 没有找到相关文章

最新更新