私は、多くのレガシーCコードを含むプロジェクトに取り組んでいます。最終的にレガシーコードを変換することも目的として、C ++での記述を開始しました。CとC ++の相互作用について少し混乱しています。C ++コンパイラでCコードをラップしてもextern "C"、Cコードの名前が壊れないことは理解していますが、これを実装する方法は完全にはわかりません。
したがって、各Cヘッダーファイルの先頭(インクルードガードの後)には、
#ifdef __cplusplus
extern "C" {
#endif下部には、
#ifdef __cplusplus
}
#endif2つの間に、すべてのinclude、typedef、および関数プロトタイプがあります。これを正しく理解しているかどうかを確認するために、いくつか質問があります。
- CヘッダーファイルBhを含み、別のCヘッダーファイルCh を含むC ++ファイルA.hhがある場合、これはどのように機能しますか?コンパイラーがBhにステップイン - __cplusplusすると、コードがラップされる- extern "C"(- __cplusplusこのブロック内で定義されない)と定義されていると思います 。したがって、Chにステップ- __cplusplusインすると、は定義されず、コードはでラップされません- extern "C"。これは正しいです?
- コードの一部をラップすることに問題はあり - extern "C" { extern "C" { .. } }ますか?2番目- extern "C"は何をしますか?
- このラッパーは.cファイルではなく、.hファイルのみに配置します。では、関数にプロトタイプがない場合はどうなりますか?コンパイラーはそれをC ++関数であると考えていますか? 
- また、Cで記述されたサードパーティのコードも使用しており、この種のラッパーはありません。そのライブラリのヘッダーを含めるときはいつでも - extern "C"、#includeを配置しています。これはそれに対処する正しい方法ですか?
- 最後に、これは良いアイデアですか?他にすべきことはありますか?近い将来、CとC ++を混合する予定です。すべてのベースをカバーできるようにしたいと思います。