共用方式為


連結規格

「連結規格」一詞是指以不同語言撰寫之連結函式 (或程序) 的通訊協定。 受影響的呼叫慣例如下:

  • 名稱區分大小寫。

  • 名稱裝飾。 在 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 指定連結)。

請參閱

參考

使用 extern 指定連結