將他人代碼移植到自己文件,功能相同但函數名不同:
// 原代碼調用 f1()
// 現有實現是 f2()
// 想用宏讓 f1() 自動替換為 f2()
#define f1 f2 是**標識符替換**,預處理階段將所有 f1 替換為 f2。
// 文件 A:只有聲明,無定義
void f1(); // 調用者包含此頭文件
// 文件 B:實現 f2
void f2() { printf("f2 running\n"); }
// 文件 C:使用宏重定向
#define f1 f2 // 在調用 f1() 的文件最前包含
#include "a.h"
void test() {
f1(); // 預處理後變為 f2(),鏈接時找到 f2 定義 ✅
}
| 寫法 | 效果 | 風險 |
|---|---|---|
#define f1 f2 | 替換標識符 f1 → f2 | 若有變量名 f1 也會被誤替換 |
#define f1() f2() | 僅替換函數調用形式 | 無法覆蓋函數指針賦值 func = f1 等場景 |
f1() → f2()f2 的目標文件f2 符號,**必須確保 f2 有定義且鏈接可見**#define f1 f2,所有調用方統一包含。#undef f1,或用具體前綴 #define LEGACY_f1 f2。static inline void f1() { f2(); }(類型安全、可調試)void (*const f1)() = f2;void f1() __attribute__((alias("f2")));#define f1 f2 **可行**,本質是文本替換,前提是 f2 定義可見且鏈接無衝突。**但屬於「預處理器黑魔法」,調試困難、易誤傷,生產代碼首選內聯包裝或鏈接器別名。**