跳轉到內容

GNU C 編譯器內部/建立編譯器擴充套件 4 1

來自華夏公益教科書,開放的書籍,開放的世界

C 語言中的函式過載

[編輯 | 編輯原始碼]

C 語言函式過載擴充套件旨在將 C++ 特性引入 C 語言,允許使用相同名稱但引數型別不同的函式。GEM 中的 cfo/test.c 示例展示了此特性

void ec_aa_add(int from, char *to);
void ec_aa_add(int from, int to);
...

用於將元素新增到池資料結構。

擴充套件實現背後的理念是重寫每個函式宣告,使新名稱包含函式引數的型別資訊。在上述情況下,修改後的名稱為 ec_aa_add_int_char_ptr 和 ec_aa_add_int_int。編譯將使用更新後的名稱正常繼續。

由於上述修改,呼叫名稱也需要修改。重新命名會考慮引數型別,以便呼叫相應的函式。例如,編譯器將修改

ec_aa_add(1,2);

ec_aa_add_int_int(1,2);

此擴充套件使用三個鉤子。函式 cfo_start_decl() 和 cfo_start_function() 攔截宣告。它們呼叫 cfo_alias_decl(),該函式使用引數型別替換名稱。為了保留不使用 CFO 擴充套件的程式的庫程式碼,使用了以下技術。如果第一次遇到函式名稱,則會建立對其舊名稱的別名,這樣就可以使用任何一個名稱來呼叫該函式。因此,舊程式碼將使用舊名稱,而 CFO 編譯的程式碼將使用型別增強後的名稱。最後,宣告名稱將更新為包含型別資訊。

當發現新的函式呼叫時,解析器會呼叫鉤子 cfo_build_function_call()。它將被呼叫函式的名稱替換為考慮實際輸入引數型別的名稱。


華夏公益教科書