为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C
UYOU 2019-12-25 14:12:04
我正在整理一些较旧的代码,这些代码到处都使用“魔术数字”来设置硬件寄存器,并且我想使用常量而不是这些数字来使代码更具表现力(实际上,它们将映射到名称/ 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 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

Ralf Holly撰写了一篇文章 ,探讨了C中的静态断言的不同选项。


他提出了三种不同的方法:


开关盒的值必须唯一

数组不能为负数

除以零表示常量表达式

他得出最佳实现的结论是:


#define assert_static(e) \

    do { \

        enum { assert_static__ = 1/(e) }; \

    } while (0)


查看完整回答
反对 回复 2019-12-25
?
白衣非少年

TA贡献1155条经验 获得超0个赞

如果您无权访问第三方库的静态断言函数(如boost),则可以滚动自己的静态断言:


#define STATIC_ASSERT(x) \

    do { \

        const static char dummy[(x)?1:-1] = {0};\

    } while(0)

不利的一面是,错误消息当然不会很有帮助,但至少会给您行号。


查看完整回答
反对 回复 2019-12-25
  • 3 回答
  • 0 关注
  • 612 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信