#define 可替換任何語彙單元,甚至是運算子。本範例示範將 ==、>、< 定義為 EQU、LAG、SMA,寫出「英文單字版」比較邏輯,展示前置處理器的文字替換本質。
#include
#define EQU ==
#define LAG >
#define SMA <
int main() {
int i = 10, j = 9;
scanf("%d", &i);
while (1) {
if (i EQU j) printf("==\n");
else if (i LAG j) printf(">\n");
else printf("<\n");
scanf("%d", &i);
}
return 0;
}
前置處理器階段,原始碼中所有 EQU 會被純文字替換為 ==,同理 LAG→>、SMA→<。編譯器看到的仍是標準 C 比較運算子,故語意完全等價。
if (i == j) printf("==\n");
else if (i > j) printf(">\n");
else printf("<\n");
#define BEGIN {
#define END }
#define AND &&
#define OR ||
#define NOT !
if (a > 0 AND b < 100) BEGIN
// ...
END
甚至可構建類 Pascal/Python 風格語法,但純屬娛樂,切勿用於正式專案。
巨集是雙面刃:善用可建立領域特定語言 (DSL)、簡化重複模板;濫用則製造難維護的「寫時讀懂,過後天曉」代碼。理解其「文字替換」本質,是駕馭 C 前置處理器的關鍵。