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直接引用這些頭文件。