#ifdef __cplusplus
extern "C" {
#endif
// 一段代碼
#ifdef __cplusplus
}
#endif
__cplusplus 是 C++ 編譯器預定義巨集。上述意思是:若為 C++ 編譯環境,用 extern "C" 包裹代碼。
C++ 支援函式多載,編譯器需將函式簽名 (參數類型、回傳類型等) 編碼進符號名稱 (Name Mangling),如 __Z1fv。C 語言無多載,符號名稱僅為函式名 (如 _f)。兩者鏈接不相容。
int f(void) { return 1; }
extern "C":產生 _f (C 風格)__Z1fv (C++ 名稱修飾)既有 C 庫編譯為 f.lib,頭文件 f.h。C++ 專案若直接 #include "f.h",編譯器以 C++ 方式處理宣告,鏈接時找不到 C 風格符號 → undefined reference。
// C 庫頭文件 f.h (或自行包裹)
extern "C" {
#include "f.h"
}
// 或在 C++ 代碼中
extern "C" {
extern void f1(); // 告訴編譯器用 C 鏈接
}
int main() { f1(); return 0; }
extern "C" 告訴 C++ 編譯器:被包裹的函式/變數採用 C 語言鏈接慣例 (不進行名稱修飾)。這是 C++ 相容 C、呼叫 C 庫、實現跨語言鏈接的關鍵機制。