我正在整理一些較舊的代碼,這些代碼到處都使用“魔術(shù)數(shù)字”來設(shè)置硬件寄存器,并且我想使用常量而不是這些數(shù)字來使代碼更具表現(xiàn)力(實際上,它們將映射到名稱/ values用于記錄寄存器)。但是,我擔(dān)心隨著更改量的增加,我可能會破壞魔術(shù)數(shù)字。這是一個簡化的示例(寄存器集更加復(fù)雜):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);我正在尋找的是以下版本的構(gòu)建時間:ASSERT(5==(state1|mode1));更新資料@Christian,感謝您的快速響應(yīng),我也對C /非增強環(huán)境的答案感興趣,因為這是驅(qū)動程序/內(nèi)核代碼。
3 回答

ITMISS
TA貢獻(xiàn)1871條經(jīng)驗 獲得超8個贊
Ralf Holly撰寫了一篇文章 ,探討了C中的靜態(tài)斷言的不同選項。
他提出了三種不同的方法:
開關(guān)盒的值必須唯一
數(shù)組不能為負(fù)數(shù)
除以零表示常量表達(dá)式
他得出最佳實現(xiàn)的結(jié)論是:
#define assert_static(e) \
do { \
enum { assert_static__ = 1/(e) }; \
} while (0)

白衣非少年
TA貢獻(xiàn)1155條經(jīng)驗 獲得超0個贊
如果您無權(quán)訪問第三方庫的靜態(tài)斷言函數(shù)(如boost),則可以滾動自己的靜態(tài)斷言:
#define STATIC_ASSERT(x) \
do { \
const static char dummy[(x)?1:-1] = {0};\
} while(0)
不利的一面是,錯誤消息當(dāng)然不會很有幫助,但至少會給您行號。
- 3 回答
- 0 關(guān)注
- 635 瀏覽
添加回答
舉報
0/150
提交
取消