c++使用鏈結指示(linkage directive)指出任意非c++函式所用的語言。
1. 宣告非c++函式
鏈結指示有兩種形式:單個的或復合的。鏈結指示不能出現在類定義或函式定義的內部,它必須出現在函式的第一次宣告上。
[cpp] #include
extern "c" size_t strlen(const char*);
extern "c"
#include
extern "c" size_t strlen(const char*);
extern "c" 第一種形式由關鍵字extern後接字串字面值,再接「普通」函式宣告構成。字串字面值指出編寫函式所用的語言。
通過將幾個函式的宣告放在跟在鏈結指示之後的花括號內部,可以給他們設定相同的鏈結。花括號的作用是將應用鏈結所示的宣告聚合起來,忽略了花括號,花括號中宣告的函式名就是可見的,就像在花括號之外宣告函式一樣。
2. 鏈結指示與標頭檔案
可以將多重宣告形式應用與整個標頭檔案。
[cpp] extern "c"
extern "c"允許將c++從c函式庫繼承而來的函式定義為c函式,擔不是必須定義為c函式——決定是用c還是用c++實現c函式庫,是每個c++實現的事情。
3. 匯出c++函式到其他語言
[cpp] extern "c" double calc(double dparm)
extern "c" double calc(double dparm)通過對函式定義使用鏈結指示,使得用其他語言編寫的程式可以使用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的專欄
第18章 特殊工具與技術 4
18.1.6 類特定的new和delete 編譯器看到類型別的new或delete表示式的時候,它檢視該類是否有operator new或operator delete成員,如果類定義 或繼承 了自己的成員new和delete函式,則使用那些函式為物件分配和釋放記憶體 否則,呼叫這些函式的標準庫版本...
第18章 特殊工具與技術 5
18.2 執行時型別識別 通過執行時型別識別 rtti 程式能夠使用基類的指標或引用來檢索這些指標或引用所指物件的實際派生型別。通過下面兩個操作符提供rtti 1 typeid操作符,返回指標或引用所指物件的實際型別。2 dynamic cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指...
第18章 特殊工具與技術 6
18.2 執行時型別識別 通過執行時型別識別 rtti 程式能夠使用基類的指標或引用來檢索這些指標或引用所指物件的實際派生型別。通過下面兩個操作符提供rtti 1 typeid操作符,返回指標或引用所指物件的實際型別。2 dynamic cast操作符,將基類型別的指標或引用安全地轉換為派生型別的指...