我正在整理一些较旧的代码,这些代码到处都使用“魔术数字”来设置硬件寄存器,并且我想使用常量而不是这些数字来使代码更具表现力(实际上,它们将映射到名称/ values用于记录寄存器)。但是,我担心随着更改量的增加,我可能会破坏魔术数字。这是一个简化的示例(寄存器集更加复杂):const short mode0 = 0;const short mode1 = 1;const short mode2 = 2;const short state0 = 0;const short state1 = 4;const short state2 = 8;所以代替:set_register(5);我们有:set_register(state1|mode1);我正在寻找的是以下版本的构建时间:ASSERT(5==(state1|mode1));更新资料@Christian,感谢您的快速响应,我也对C /非增强环境的答案感兴趣,因为这是驱动程序/内核代码。
3 回答
![?](http://img1.sycdn.imooc.com/545865470001bf9402200220-100-100.jpg)
ITMISS
TA贡献1871条经验 获得超8个赞
Ralf Holly撰写了一篇文章 ,探讨了C中的静态断言的不同选项。
他提出了三种不同的方法:
开关盒的值必须唯一
数组不能为负数
除以零表示常量表达式
他得出最佳实现的结论是:
#define assert_static(e) \
do { \
enum { assert_static__ = 1/(e) }; \
} while (0)
![?](http://img1.sycdn.imooc.com/5f33c0c90001f9ad05720572-100-100.jpg)
白衣非少年
TA贡献1155条经验 获得超0个赞
如果您无权访问第三方库的静态断言函数(如boost),则可以滚动自己的静态断言:
#define STATIC_ASSERT(x) \
do { \
const static char dummy[(x)?1:-1] = {0};\
} while(0)
不利的一面是,错误消息当然不会很有帮助,但至少会给您行号。
- 3 回答
- 0 关注
- 612 浏览
添加回答
举报
0/150
提交
取消