リンケージの設計
用語 「 specification 」リンケージの異なる言語で記述された関数 (またはプロシージャ) をリンクするプロトコルを示します。次の呼び出し規約に影響があります。:
名前の大文字と小文字が区別されます。
名前の装飾。C ではコンパイラはアンダースコア () という名前の先頭に付けられます。これは呼び出されます」。と 「装飾C++ ではリンク フェーズでは型情報を保持するには名前の装飾が使用されます。(装飾名 を参照してください)
引数をスタック上で想定される順序。
関数がスタックを調整するための役割です。呼び出された関数または呼び出し元の関数に責任があります。
(する非表示の引数が渡されたかを非表示の引数の渡し方。
extern string-literal { declaration-list }
extern string-literal declaration
リンケージ指定が徐々にのコードの使用を許可してC++ に C コードを移植する手段を提供します。
Microsoft 固有の仕様 →
現在 Microsoft C++ でサポートされているリンケージ指定 C 」 15 「 はC++ 」 「 です。
終了 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 規格ではファイルを使用する C++ コンパイルを検出する条件付きコンパイル ディレクティブが含まれます。C.C++ コンパイルが検出されるとプロトタイプは extern 「 C 」 15 のディレクティブで次のように囲まれています :
// Sample.h
#if defined(__cplusplus)
extern "C"
{
#endif
// Function declarations
#if defined(__cplusplus)
}
#endif
終了 Microsoft 固有の仕様→
extern 「 C 」 15 としてインクルード ファイルを標準の関数を宣言する必要はありません。
関数がオーバーロードされている場合は同じ名前の関数の 1 個のリンケージ指定子を含むことはできません。(詳細については関数オーバーロード を参照してください)。
さまざまなリンケージ指定の動作を次の表に示します。
リンケージ指定の影響
仕様 |
効果 |
---|---|
オブジェクト |
そのオブジェクトのリンクのみに影響します |
関数 |
その内部で宣言されたとそのすべての関数のあらゆるオブジェクトに適用されます |
クラス |
クラス内で宣言されたすべての非メンバー関数およびオブジェクトのリンケージに影響します。 |
関数に複数のリンケージ指定がある場合; 一致する必要があります 15 ではC および C++ のどちらのリンケージを持つとして関数を宣言するエラー。また関数の 2 種類の宣言とプログラム —リンケージ指定の 1 と 1 にが発生します (外部リンケージ指定を含む宣言は1 番目である必要があります。既にリンケージ指定の関数のどのような宣言が最初の宣言で指定されているリンクされます。次に例を示します。
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 のキーワードに関する詳細については 外部リンケージを指定するを使用します を参照してください)。