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