GNU C 編譯器內部/建立編譯器擴充套件 4 1
外觀
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()。它將被呼叫函式的名稱替換為考慮實際輸入引數型別的名稱。