首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C 語言巨集玩法:用 #define 重新定義比較運算子

     編輯:關於C語言

前言:巨集不只是常數替換

#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");

實務價值與警示

  • 教學示範:理解巨集單純做文字替換,不具語意分析能力
  • 混淆代碼:可用於簡單的源碼混淆 (Obfuscation),增加逆向難度
  • 嚴禁生產環境:極大降低可讀性,違反「最小驚訝原則」,團隊協作噩夢
  • 偵錯困難:除錯器顯示的是展開後的運算子,斷點對應原始碼行號可能混淆

延伸玩法

#define BEGIN {
#define END   }
#define AND   &&
#define OR    ||
#define NOT   !

if (a > 0 AND b < 100) BEGIN
    // ...
END

甚至可構建類 Pascal/Python 風格語法,但純屬娛樂,切勿用於正式專案。

總結

巨集是雙面刃:善用可建立領域特定語言 (DSL)、簡化重複模板;濫用則製造難維護的「寫時讀懂,過後天曉」代碼。理解其「文字替換」本質,是駕馭 C 前置處理器的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved