首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

深入解析 extern "C":C/C++ 混合編程的鏈接橋樑

     編輯:關於C++

常見代碼模式


#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++ 呼叫 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 庫、實現跨語言鏈接的關鍵機制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved