連結規格
「連結規格」一詞是指以不同語言撰寫之連結函式 (或程序) 的通訊協定。 受影響的呼叫慣例如下:
名稱區分大小寫。
名稱裝飾。 在 C 中,編譯器會在名稱前面加上底線。 這通常稱為「裝飾」。在 C++ 中,名稱裝飾是用來在整個連結階段保留類型資訊(請參閱裝飾名稱)。
堆疊上預期的引數順序。
負責在函式傳回時調整堆疊。 由被呼叫的函式或呼叫的函式負責。
傳遞隱藏的引數 (無論是否傳遞任何隱藏的引數)。
extern string-literal { declaration-list }
extern string-literal declaration
連結規格允許使用現有程式碼,協助逐漸將 C 程式碼移植至 C++。
Microsoft 特定的
Microsoft C++ 目前唯一支援的連結規格是「C」和「C++」。
END Microsoft 特定的
下列範例會使用 C 連結宣告函式 atoi 和 atol:
extern "C"
{
int atoi( char *string );
long atol( char *string );
}
呼叫這些函式時需使用 C 連結。 使用下列這兩種宣告可能也會得到相同的結果:
extern "C" int atoi( char *string );
extern "C" long atol( char *string );
Microsoft 特定的
所有 Microsoft C 標準 include 檔均使用條件式編譯指示詞來偵測 C++ 編譯。 偵測到 C++ 編譯時,會以 extern "C" 指示詞括住原型,如下所示:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
END Microsoft 特定的
您不需要將標準 include 檔中的函式宣告為 extern "C"。
如果函式多載,只能有一個相同名稱的函式具有連結指定名稱 (如需詳細資訊,請參閱函式多載)。
下表顯示各種連結規格的作用。
連結規格的作用
規格 |
作用 |
---|---|
針對物件 |
只會影響該物件的連結 |
針對函式 |
會影響該函式與在其中宣告之所有函式或物件的連結 |
針對類別 |
會影響在類別內宣告之所有非成員函式和物件的連結 |
如果函式具有多個連結規格,這些規格必須一致;將函式宣告為同時具有 C 和 C++ 連結是錯誤的。 此外,如果程式中的一個函式發生兩次宣告 (一個使用連結規格,另一個沒有),則使用連結規格的宣告必須是第一個。 第一個宣告會針對任何已經有連結規格的其餘函式宣告指定連結。 例如:
extern "C" int CFunc1();
...
int CFunc1(); // Redeclaration is benign; C linkage is
// retained.
int CFunc2();
...
extern "C" int CFunc2(); // Error: not the first declaration of
// CFunc2; cannot contain linkage
// specifier.
在複合連結指定名稱 ({ }) 本體內明確宣告為 static 的函式和物件均視為靜態函式或物件;會忽略連結指定名稱。 其他函式和物件的行為會就像使用 extern 關鍵字宣告一般 (如需關於 extern 關鍵字的詳細資訊,請參閱使用 extern 指定連結)。