首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“解包装”宏参数

“解包装”宏参数
EN

Stack Overflow用户
提问于 2021-10-28 16:17:11
回答 2查看 250关注 0票数 3

我有以下宏:

代码语言:javascript
复制
#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的单个参数,而我得到的错误是参数太少。

代码语言:javascript
复制
const myStructure Table[ENTRY_COUNT] =                   
{
   /* Entity Index 0 */
   {
      <some structure fields>,
      ADD_FLAGS(HEX),     // 8-byte array
      <more structure fields>
   }
}

我也尝试过以下几种变体,但没有成功:

代码语言:javascript
复制
#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和任务处理)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-28 16:56:14

除了强制性的“避免宏”之外,您只需将ADD_FLAGS包装在另一个宏中即可。

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

代码语言:javascript
复制
#define ADD_FLAGS(...) ADD_FLAGS_(__VA_ARGS__)

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

不知道如何使用旧的MSVC预处理器,但由于它是出了名的错误,如果可能的话,我会避免支持它。

票数 2
EN

Stack Overflow用户

发布于 2021-10-28 16:50:25

我建议你少用宏。这里有一个例子片段,它做的正是宏正在做的事情,但在我看来,它更合理一些。

代码语言:javascript
复制
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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69757614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档