C++における extern "C" の効果のコード解説
C++における extern "C"
の効果について
日本語:
C++において、extern "C"
キーワードは、関数や変数のリンケージ(リンク時に識別される名前)を変更するために使用されます。通常、C++では、関数や変数の名前は名前マングリング(name mangling)と呼ばれるプロセスによってエンコードされます。これは、C++のオーバーロードやテンプレートなどの機能に対応するために必要です。
しかし、C++とCのコードを混在させる場合、Cのコンパイラは名前マングリングを行いません。そのため、C++からCの関数や変数にアクセスする場合、またはCからC++の関数や変数にアクセスする場合、両方の言語で同じ名前を使用する必要があります。
extern "C"
キーワードを使用すると、以下のように動作します:
- 名前マングリングを抑制します: C++コンパイラは、
extern "C"
で宣言された関数や変数の名前をマングリングしません。 - Cのリンケージを使用します: C++コンパイラは、
extern "C"
で宣言された関数や変数をCのリンケージ規則に従ってリンクします。
例:
// C++ header file
extern "C" {
int add(int a, int b);
}
// C implementation file
int add(int a, int b) {
return a + b;
}
この例では、add
関数は extern "C"
で宣言されているため、C++コンパイラは名前マングリングを行いません。これにより、Cのコンパイラが add
関数を認識し、適切にリンクすることができます。
C++ヘッダーファイル (header.h
)
extern "C" {
int add(int a, int b);
}
extern "C"
ブロック: このブロック内の関数や変数は、Cのリンケージ規則に従って宣言されます。add
関数: Cの関数宣言と同じ形式で宣言されています。
Cの実装ファイル (implementation.c
)
int add(int a, int b) {
return a + b;
}
add
関数: Cの実装ファイルで定義されています。
C++の実装ファイル (main.cpp
)
#include "header.h"
int main() {
int result = add(3, 4);
std::cout << "Result: " << result << std::endl;
return 0;
}
- インクルード: C++のヘッダーファイルをインクルードします。
add
関数の呼び出し: C++のコードからCの関数add
を呼び出します。
動作
- C++コンパイラは、
header.h
をコンパイルするとき、add
関数をCのリンケージ規則に従って宣言します。 - プログラムを実行すると、
add
関数が呼び出され、計算結果が出力されます。
ポイント:
extern "C"
ブロックを使用することで、C++とCのコードを混在させることができます。extern "C"
ブロック内の関数や変数は、Cのリンケージ規則に従って宣言されるため、両言語間での相互運用が可能です。- C++とCのコードを混在させる場合、名前のマングリングの違いに注意が必要です。
extern "C"
を使用することで、この問題を回避することができます。
C++の外部リンケージ宣言
C++では、extern
キーワードを使用して、外部リンケージを指定することもできます。ただし、この場合、C++のリンケージ規則に従うため、名前マングリングが行われます。
extern int add(int a, int b);
この宣言は、add
関数が外部で定義されていることを示し、C++のリンケージ規則に従ってリンクされます。
C++の名前修飾
C++では、名前修飾(name decoration)を使用して、Cのリンケージ規則に従う関数や変数を宣言することもできます。
#define C_LINKAGE __declspec(dllimport)
C_LINKAGE int add(int a, int b);
この例では、C_LINKAGE
マクロを使用して、Cのリンケージ規則に従う関数を宣言しています。
C++のコンパイラオプション
一部のC++コンパイラは、Cのリンケージ規則に従うためのコンパイラオプションを提供しています。例えば、GCCでは -fno-automatic-namespaces
オプションを使用することができます。
g++ -fno-automatic-namespaces main.cpp implementation.c
このオプションを使用すると、C++の自動名前空間機能を無効にし、Cのリンケージ規則に従ってリンクします。
C++のABI互換ライブラリ
C++のABI(Application Binary Interface)互換ライブラリを使用することで、C++とCのコードを混在させることができます。これらのライブラリは、C++のリンケージ規則に従う一方で、Cのリンケージ規則と互換性を持たせることができます。
c++ c linkage