C++ では、宣言された関数または変数を C 言語のリンケージ方式で処理するように C++ コンパイラーに指示するリンケージ仕様extern "C"
です。この宣言は主に、C++ コードで C 言語で記述されたライブラリを参照する場合に使用されます。
C++ コンパイラは、関数のオーバーロードなどの機能をサポートするために、コンパイル プロセス中に関数名 (名前マングリング)を調整します(名前マングリングとも呼ばれます) 。いわゆるアダプテーションとは、リンク時に正しい関数が見つかるように、パラメーターの種類や数量などの追加情報を関数名に付加することです。したがって、C++ でコンパイルされた同じ関数名の形式は、C でコンパイルされた形式と異なる場合があります。
ただし、C 言語は関数のオーバーロードをサポートしていないため、C 言語では関数名はコンパイル後に変更されず、元の関数名のままになります。したがって、C++ で C 関数を直接参照すると、名前のマングリングによりリンカが正しい関数を見つけられない可能性があります。
extern "C"
この問題を解決するために作成されました。これは、宣言された関数または変数が C で記述されており、C として、つまり名前のマングリングなしでリンクする必要があることを C++ コンパイラーに指示します。
たとえば、C ライブラリ ファイル「c_library.h」がある場合、次のように C++ でそれを参照できます。
extern "C" {
#include "c_library.h"
}
このようにして、c_library.h
のすべての関数とグローバル変数が C 言語にリンクされ、C++ コードで正しく参照できるようになります。
extern "C"
これは、ヘッダー ファイル全体をインクルードするだけでなく、単一の関数または変数の宣言にも使用できることに注意してください。次に例を示します。
extern "C" void c_function(); // 声明一个C语言的函数
extern "C" int c_variable; // 声明一个C语言的全局变量
さらに、extern "C"
中括弧 {} を使用して複数の C 関数または変数を含めることもできます。
extern "C" {
void c_function1();
void c_function2();
int c_variable;
}
このように、c_function1
C言語では、、、c_function2
がリンクされます。c_variable