タグ付けされた質問 「extern-c」


4
C ++とCを組み合わせる-#ifdef __cplusplusはどのように機能しますか?
私は、多くのレガシー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 ++を混合する予定です。すべてのベースをカバーできるようにしたいと思います。


9
C関数を名前変換できないのはなぜですか?
私は最近インタビューを受けました、そして尋ねられた一つの質問はextern "C"C ++コードで何が使用されているかということでした。Cは名前のマングリングを使用しないので、C ++コードでC関数を使用することだと答えました。Cが名前のマングリングを使用しない理由を尋ねられましたが、正直に答えることができませんでした。 C ++コンパイラーが関数をコンパイルすると、主にコンパイル時に解決する必要があるC ++で同じ名前のオーバーロードされた関数を使用できるため、関数に特別な名前が付けられることを理解しています。Cでは、関数の名前は同じままか、おそらくその前に_が付いています。 私のクエリは:C ++コンパイラがC関数を壊すことを許可することの何が問題になっていますか?コンパイラがそれらに付ける名前は問題ではないと私は思いました。CおよびC ++でも同じように関数を呼び出します。
136 c++  c  name-mangling  extern-c 

4
C ++コードからC関数を呼び出す
C ++から呼び出したいC関数があります。extern "C" void foo()C関数がg ++を使用してコンパイルできなかったため、 " "のようなアプローチを使用できませんでした。ただし、gccを使用すると正常にコンパイルされます。C ++から関数を呼び出す方法はありますか?
90 c++  c  linux  extern-c 

7
CからC ++関数を呼び出す方法は?
私はこれを知っている。 C ++からC関数を呼び出す: アプリケーションがC ++であり、Cで記述されたライブラリから関数を呼び出さなければならなかった場合、 //main.cpp extern "C" void C_library_function(int x, int y);//prototype C_library_function(2,4);// directly using it. これは名前C_library_functionを壊さず、リンカーは入力* .libファイルで同じ名前を見つけ、問題は解決されます。 CからC ++関数を呼び出す??? しかし、ここではCで書かれた大きなアプリケーションを拡張しているので、C ++で書かれたライブラリを使用する必要があります。ここでは、C ++の名前マングリングが問題を引き起こしています。リンカーは、未解決のシンボルについて不平を言っています。CプロジェクトでC ++コンパイラを使用することはできません。これは、他の多くのものを壊してしまうためです。抜け道は何ですか? ちなみに私はMSVCを使用しています
84 c++  c  visual-c++  extern-c 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.