C++ 支持函數重載,編譯器通過名字修飾將函數簽名(函數名、參數個數、類型、命名空間、類名等)編碼進符號表。例如:
foo(int, int) → _foofoo(int, int) → _foo_int_int(不同編碼器方案不同)此機制使同名函數在符號層面唯一,實現重載。C 語言無此機制,故不支持重載。
#ifndef MODULE_A_H
#define MODULE_A_H
#ifdef __cplusplus
extern "C" {
#endif
int foo(int x, int y); // C 風格鏈接
#ifdef __cplusplus
}
#endif
#endif
#ifndef/#define/#endif 傳統衛語句。extern "C" 告訴 C++ 編譯器:包裹內函數採用 C 語言鏈接約定(不修飾名字),使 C/C++ 混合編程成為可能。extern "C" { ... }。// C++ 代碼
extern "C" {
#include "c_library.h" // C 頭文件
}
// C++ 實現文件
extern "C" int cpp_func(int x, int y) { return x + y; }
// C 代碼僅聲明
extern int cpp_func(int x, int y); // 不能包含 extern "C"
extern "C" 改變編譯語言。實則只影響鏈接符號,代碼仍按 C++ 編譯。#ifdef __cplusplus 守護 extern "C",同一頭文件同時服務于 C/C++。extern "C" int g_var; 確保符號一致。