[C 的那些眉角]#define vs const vs enum — 定義常數,哪種才對?

在嵌入式開發裡,定義常數這件事做了幾萬次,但我敢說大多數人都沒有認真想過「這三種到底有什麼差別」。

反正 #define 能跑、const 也能用,切換狀態就 enum,好像各有各的場,不去想也沒事。

直到某次 code review,被人問了一句:「這裡為什麼用 #define 而不是 const?」

我愣了一下。說真的,我沒有理由,就只是習慣。


先說結論

不想看完可以直接記這個:

情境 建議
硬體暫存器位址、bit mask #define
有型別的常數值 const
一組互斥的狀態 / 選項 enum
條件編譯、平台切換 #define
陣列長度(C99 以後) enumconst 均可,但 #define 最保險

但只知道結論沒什麼用,知道背後的理由才不會在邊緣情況翻車。

閱讀全文