私は、多くのレガシーCコードを含むプロジェクトに取り組んでいます。最終的にレガシーコードを変換することも目的として、C ++での記述を開始しました。CとC ++の相互作用について少し混乱しています。C ++コンパイラでCコードをラップしてもextern "C"
、Cコードの名前が壊れないことは理解していますが、これを実装する方法は完全にはわかりません。
したがって、各Cヘッダーファイルの先頭(インクルードガードの後)には、
#ifdef __cplusplus
extern "C" {
#endif
下部には、
#ifdef __cplusplus
}
#endif
2つの間に、すべての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 ++を混合する予定です。すべてのベースをカバーできるようにしたいと思います。