相关疑难解决方法(0)

在C语言中在构建时ASSERT表达式的方法

我正在整理一些旧的代码,这些代码使用"幻数"来设置硬件寄存器,我想使用常量而不是这些数字来使代码更具表现力(实际上它们将映射到名称/用于记录寄存器的值).

但是,我担心随着变化的数量,我可能会打破神奇的数字.这是一个简化的例子(寄存器集更复杂):

const short mode0 = 0;
const short mode1 = 1;
const short mode2 = 2;

const short state0 = 0;
const short state1 = 4;
const short state2 = 8;
Run Code Online (Sandbox Code Playgroud)

而不是:

set_register(5);
Run Code Online (Sandbox Code Playgroud)

我们有:

set_register(state1|mode1);
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是构建时间版本:

ASSERT(5==(state1|mode1));
Run Code Online (Sandbox Code Playgroud)

更新

@Christian,感谢快速响应,我对C/non-boost环境的答案感兴趣,因为这是驱动程序/内核代码.

c refactoring assert static-assert

25
推荐指数
8
解决办法
2万
查看次数

为什么打包结构5的大小而不是4个字节?

参见在线示例: Ideone示例

struct {
  union {
    struct {
      uint32_t messageID : 26;
      uint8_t priority : 3; 
    } __attribute__ ((packed));
    uint32_t rawID : 29;
  } __attribute__ ((packed));
  uint8_t canFlags : 3;
} __attribute__ ((packed)) idSpecial;
Run Code Online (Sandbox Code Playgroud)

为什么编译器会将结构的大小报告为5个字节而不是4个?它应该包含32位.

c c++ gcc struct bit-fields

8
推荐指数
2
解决办法
1103
查看次数

标签 统计

c ×2

assert ×1

bit-fields ×1

c++ ×1

gcc ×1

refactoring ×1

static-assert ×1

struct ×1