- ベストアンサー
extern "C" の利用方法に関して
皆さんこんにちは。 extern "C"使って、 C++に書いてある関数をCでも使おうと、 もがいている最中の者です。 C++側のソース内にある、 Cでも使いたい関数に「eztern "C"」をつけ足しコンパイルに成功しました。 これから、C側でも、 C++から引用したい関数にexternをつけて、 コンパイルをしてしまおうとは思っているのですが、 C++のソース内にある関数を C側でも使うための作業としては、 これだけでいいのでしょうか? 今回作成した 「C++」のソースと「C」のソースは、 全然違うディレクトリにそれぞれ存在しているのですが、 それぞれは、認識され合うものなのでしょうか? お互いのコンパイルにあたってオプションを指定するか、 Makefileで書き換えるべき部分があるのでしょか? 笑ってしまうよな質問でしたらすいませんが、 アドバイスいただけるとありがたいです。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
> C++のソース内にある関数を > C側でも使うための作業としては、 > これだけでいいのでしょうか? ダメです。 まず、CでもC++でも使える型しか、引数や返却値に使うことができません。また、ポインタを返す場合は、呼び出し側でdeleteしないといけないようなものは、別途解放の手段を用意しなければなりません。 次に、C++の関数型例外が送出される可能性がある場合、それを内部で捕捉してエラーコードか何かに置き換えてやらなければなりません。 さらに、リンクの際には、処理系によってはC++のための何らかの設定等が必要になる場合があります。
その他の回答 (3)
- vfr_rooom
- ベストアンサー率66% (2/3)
オブジェクトファイルをリンカにかけるときに、 C側に「-lstdc++」オプションを付けてあげてるかな? C++では「libstdc++」が自動でリンクされるが、 Cでは、そうは行かんからな。 コンパイルの段階では、あとは皆さんのおっしゃる通りかと。 そんなところじゃないかな。
- Tacosan
- ベストアンサー率23% (3656/15482)
あくまで理論的にはそれだけです. もちろん「全然違うディレクトリにそれぞれ存在している」ならそれなりにしなければならないことはありますが, それは「C か C++ か」という問題とは独立です. 全て C で (あるいは C++ で) 書いているとしてもやることは同じ. ディレクトリ構成やファイルの配置, あるいは「現在の Makefile」などがあれば, 「こうした方がいい」とかアドバイスできるかもしれません (もちろん「やっぱり手におえない」ということもありえる).
- toda hiro(@hiro_knigh)
- ベストアンサー率39% (59/151)
やりたい事が今ひとつ分かりません。 「extern "C"」というのは、「この関数はC言語のリンケージ規約でコンパイルされた物」だと言う事をコンパイラ及びリンカに教えるための宣言です。 「extern "C"」が何故あるのかというと、C言語とC++ではリンケージ規約が違うからです。 どういう事かというと、同じ関数宣言でもC言語とC++とでそれぞれ生成されたオブジェクトファイルを比較するとリンクするための形式が異なります。 なので、C言語でコンパイルされた関数(オブジェクトファイル)をC++側から使おうとした場合に「extern "C"」をつけてC言語の規約でリンクする必要がある事を教えるわけです。 逆にC言語側からC++の関数を使おうとした場合の方法については、うーん、あまりメリットがないので調べた事がありません。 それでも調べて欲しいという事であれば、調べてみましょう。