在C++程序中調用被C編譯器編譯後的函數,爲什麼要加extern “C”

C++語言是一種面向對象編程語言,支持函數重載,而C語言是面向過程的編程語言,不支持函數重載,所以函數被C++編譯後在哭中的名字與C語言的不同,如果聲明一個C語言函數float f(int a, char b),C++的編譯器就會將這個名字變成像_f_int_char之類的東西以支持函數重載,然而C語言編譯器的庫一般不執行該轉換,所以它的內部名爲_f,這樣連接器將無法解釋C++對函數f()的調用。

C++提供了C語言Alternate likeage specifications(替換連接說明)符號extern "C"來解決名字匹配問題,extern是C/C++語言中表明函數和全局變量作用範圍(可見性)的關鍵字,該關鍵字告訴編譯器,其聲明的函數和變量可以在模塊或其他模塊中使用。extern後跟一個字符串來指定向聲明的連接類型,後面是函數聲明。

extern "C" float f(int a, char b);

該語句的目的是高速編譯器f()是C連接的,這樣C++就不會轉換函數名。標準的連接類型執行符有“C”和“C++”兩種,但編譯器開發商也可以選擇用同樣的方法支持其他語言。如果有一組替代連接的聲明,可以把它們放在花括號裏:

extern "C" {

    float f(int a, char b);

...//其他函數

}

extern "C" {

    #include "Myheader.h"

...//其他C頭文件

}

這就告訴C++編譯器,函數f是C連接的,應該到庫中找名字_f而不是找_f_int_char。C++編譯器開發商已經對C標準庫的頭文件作了extern "C"處理,所以可以用#include直接引用這些頭文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章