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

我正在整理一些较旧的代码,这些代码到处都使用“魔术数字”来设置硬件寄存器,并且我想使用常量而不是这些数字来使代码更具表现力(实际上,它们将映射到名称/ 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 /非增强环境的答案感兴趣,因为这是驱动程序/内核代码。


UYOU
浏览 613回答 3
3回答

ITMISS

Ralf Holly撰写了一篇文章 ,探讨了C中的静态断言的不同选项。他提出了三种不同的方法:开关盒的值必须唯一数组不能为负数除以零表示常量表达式他得出最佳实现的结论是:#define assert_static(e) \    do { \        enum { assert_static__ = 1/(e) }; \    } while (0)

白衣非少年

如果您无权访问第三方库的静态断言函数(如boost),则可以滚动自己的静态断言:#define STATIC_ASSERT(x) \    do { \        const static char dummy[(x)?1:-1] = {0};\    } while(0)不利的一面是,错误消息当然不会很有帮助,但至少会给您行号。
打开App,查看更多内容
随时随地看视频慕课网APP