[解決済み] C++でextern "C"{ #include <foo.h> }が必要な理由とは?
疑問点
なぜ使用する必要があるのでしょうか。
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"
のコードによってインクルードされるかもしれないという事実をすでに考慮しているからです。
関連
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] コピーアンドスワップ慣用句とは?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] C++で仮想関数が必要な理由とは?
-
[解決済み] 8192個の要素にループをかけると、プログラムが遅くなるのはなぜですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] C++でextern "C "を使用した場合の効果は?