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

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

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

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

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


先說結論

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

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

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

閱讀全文

[C 的那些眉角]#define 的陷阱 — 沒用好會掉進坑

#define 可以說是 C 語言裡最早學到的東西之一。

#define MAX_SIZE 256
#define PI 3.14159

看起來很無害,對吧?

但用久了才發現,#define 其實是個很容易出事的工具。
它不是變數、不是函式、不遵守 scope、不做型別檢查,
就是單純的文字替換。

而「單純的文字替換」,在某些情況下會產生你完全沒預期到的結果。

這篇記錄幾個我自己踩過、或在 code review 看過的坑。

閱讀全文