1. ホーム
  2. c++

[解決済み] C++でextern "C"{ #include <foo.h> }が必要な理由とは?

2022-05-17 16:05:58

疑問点

なぜ使用する必要があるのでしょうか。

extern "C" {
#include <foo.h>
}

具体的には

  • いつ使うべきか?

  • これを使う必要があるのは、コンパイラ/リンカレベルで何が起きているからですか?

  • コンパイル/リンクの観点から、これを使う必要がある問題をどのように解決するのでしょうか?

どのように解決するのですか?

C と C++ は表面的には似ていますが、それぞれが非常に異なるコード セットにコンパイルされます。C++ コンパイラーでヘッダー ファイルをインクルードする場合、コンパイラーは C++ コードを期待しています。しかし、それがCのヘッダーである場合、コンパイラはヘッダーファイルに含まれるデータが特定のフォーマット(C++の「ABI」、または「Application Binary Interface」)にコンパイルされることを期待するので、リンカーは窒息してしまうのです。これは、C データを期待する関数に C++ データを渡すよりも望ましいことです。

(本当に細かいことを言うと、C++ の ABI は一般的に関数/メソッドの名前を「混乱」させるので、C++ の関数に printf() を呼び出すと、C++ は実際に、プロトタイプを C 関数としてフラグ付けすることなく _Zprintf を呼び出すコードが生成され、さらに最後に余分なガラクタが追加されます)。

だから:使用する extern "C" {...} を使うことです。これはとても簡単なことです。さもなければ、コンパイルされたコードに不一致が生じ、リンカーは窒息してしまいます。しかし、ほとんどのヘッダでは extern なぜなら、ほとんどのシステム C ヘッダは、C++ コードによってインクルードされるかもしれないという事実をすでに考慮に入れていて、すでに extern "C" のコードによってインクルードされるかもしれないという事実をすでに考慮しているからです。