連結規格
"連結規格 」 一詞指的是連結的函式 (或程序) 以不同語言撰寫的通訊協定。下列的呼叫慣例會受到影響:
名稱區分大小寫。
名稱的裝飾。在 c 中,編譯器的開頭以底線開頭的名稱。這通常稱為 「"裝飾。 C + + 名稱裝飾用來保留透過 「 連結 」 階段的型別資訊。(請參閱裝飾名稱)
預期在堆疊的引數的順序。
負責調整堆疊上函式傳回。呼叫的函式或呼叫的函式負責。
傳遞的隱藏引數 (是否通過任何隱藏的引數)。
extern string-literal { declaration-list }
extern string-literal declaration
連結規格幫助您逐漸移植至 C++ 的 c 程式碼,藉由使用現有的程式碼使用。
Microsoft 專有的
目前 Microsoft C++ 所支援的唯一的連結規格是 "C" 和 "C + +"。
結束 Microsoft 特定
下列範例會宣告函式atoi和atol使用 c 連結:
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 標準包括偵測 C++ 編譯的檔案使用條件式編譯指示詞。偵測到 C++ 編譯時,原型會加上 extern"C" 指示詞,如下所示:
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
結束 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.
函式和物件明確宣告為靜態 複合連結規範的主體內 ({}) 會被視為靜態函式或物件; 這個連結規範會被忽略。其他函式和物件會呈現如同使用宣告extern關鍵字。(請參閱指定連結至使用 extern 如需詳細資訊extern關鍵字。)