18.7.3 鏈接指示:extern “c”
C++使用鏈接指示(linkage directive)指出任意非C++函數所用的語言。
1. 聲明非C++函數
鏈接指示有兩種形式:單個的或復合的。鏈接指示不能出現在類定義或函數定義的內部,它必須出現在函數的第一次聲明上。
[cpp] #include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}
#include <cstdlib>
extern "C" size_t strlen(const char*);
extern "C" {int strcmp(const char*,const char*);
char *strcat(char*,const char*);}第一種形式由關鍵字extern後接字符串字面值,再接“普通”函數聲明構成。字符串字面值指出編寫函數所用的語言。
通過將幾個函數的聲明放在跟在鏈接指示之後的花括號內部,可以給他們設定相同的鏈接。花括號的作用是將應用鏈接所示的聲明聚合起來,忽略了花括號,花括號中聲明的函數名就是可見的,就像在花括號之外聲明函數一樣。
2. 鏈接指示與頭文件
可以將多重聲明形式應用與整個頭文件。
[cpp] extern "C"{
#include <string.h>
}
extern "C"{
#include <string.h>
}允許將C++從C函數庫繼承而來的函數定義為C函數,擔不是必須定義為C函數——決定是用C還是用C++實現C函數庫,是每個C++實現的事情。
3. 導出C++函數到其他語言
[cpp] extern "C" double calc(double dparm){
return 0.0;
}
extern "C" double calc(double dparm){
return 0.0;
}通過對函數定義使用鏈接指示,使得用其他語言編寫的程序可以使用C++函數。
用鏈表指示定義的函數的每個聲明都必須使用相同的鏈接指示。
4. 鏈接指示支持的語言
要求編譯器支持對C語言的鏈接指示,編譯器可以為其他語言提供鏈接說明。例如,extern "Ada"、extern "FORTRAM"等。
5. 重載函數與鏈接指示
鏈接指示與函數重載之間的相互作用依賴於目標語言。如果語言支持重載函數,則為該語言實現鏈接指示的編譯器很可能也支持C++的這些函數的重載。
C++保證支持的唯一語言是C。C語言不支持函數重載,所以,不應該對下面的情況感到驚訝:在一組重載函數中只能為一個C函數指定鏈接指示。用給定名字的C鏈接聲明多於一個函數是錯誤的。
在C++程序中,重載C函數很常見,但是,重載集合中的其他函數必須都是C++函數。
6. extern “C”函數的指針
編寫函數所用的語言是函數類型的一部分。為了聲明用其他程序設計語言編寫的函數的指針,必須使用鏈接指示。
C函數的指針與C++函數的指針具有不同的類型,不能將C函數的指針初始化或賦值為C++函數的指針。
摘自 xufei96的專欄