マングリングなしで既にコンパイルされているライブラリまたはオブジェクトextern "C"
のヘッダー ファイルおよび C++ オブジェクト ファイル内の名前のマングリングを防止するために使用します。
たとえばwidget
、C コンパイラでコンパイルされたライブラリがあり、公開されたインターフェイスがマングルされていないとします。
ヘッダー ファイルをそのままコードにインクルードすると、名前がマングルされていると見なされ、それらのマングルされたバージョンがリンカーに探すように指示されます。
ただし、次のようなものを要求するfunction@intarray_float_charptr
と、widget
ライブラリは公開されているだけになるfunction
ため、問題が発生します。
ただし、次のように含める場合:
extern "C" {
#include "widget.h"
}
function
コンパイラは、マングルされていないバージョンのを使用する必要があることを認識します。
そのため、C または C++ プログラムに含まれることを意図した C のヘッダー ファイルには、次のようなものが表示されます。
#ifdef __cplusplus
extern "C" {
#endif
// Everything here works for both C and C++ compilers.
#ifdef __cplusplus
}
#endif
Cコンパイラを使用してこれを含めると、#ifdef
行によってextern "C"
内容が消えます。C++ コンパイラ ( where__cplusplus
が定義されている) の場合、すべてがマングルされません。