なぜ使用する必要があるのか:
extern "C" {
#include <foo.h>
}
具体的には:
いつ使用すればよいですか?
コンパイラ/リンカー レベルで何が起こって、それを使用する必要があるのでしょうか?
コンパイル/リンクの観点から、これを使用する必要がある問題はどのように解決されるのでしょうか?
ベストアンサー1
C と C++ は表面的には似ていますが、それぞれコンパイルするとまったく異なるコード セットになります。C++ コンパイラでヘッダー ファイルをインクルードする場合、コンパイラは C++ コードを期待します。ただし、それが C ヘッダーの場合、コンパイラはヘッダー ファイルに含まれるデータが特定の形式 (C++ の「ABI」または「アプリケーション バイナリ インターフェイス」) にコンパイルされることを期待するため、リンカーが停止します。これは、C データを期待する関数に C++ データを渡すよりも好ましい方法です。
(本当に細かいことを言うと、C++ の ABI は一般に関数/メソッドの名前を「マングル」するため、printf()
プロトタイプを C 関数としてフラグ付けせずに呼び出すと、C++ は実際に を呼び出すコード_Zprintf
と、最後に余分なゴミを生成します。)
つまり、extern "C" {...}
ac ヘッダーをインクルードするときに を使用します。これはとても簡単です。そうしないと、コンパイルされたコードに不一致が生じ、リンカーが停止します。ただし、ほとんどのヘッダーでは は必要ありません。extern
ほとんどのシステム C ヘッダーは、C++ コードによってインクルードされる可能性があることを既に考慮しており、extern "C"
コードも既に考慮されているからです。