
皆さんこんにちは。
extern "C"使って、
C++に書いてある関数をCでも使おうと、
もがいている最中の者です。
C++側のソース内にある、
Cでも使いたい関数に「eztern "C"」をつけ足しコンパイルに成功しました。
これから、C側でも、
C++から引用したい関数にexternをつけて、
コンパイルをしてしまおうとは思っているのですが、
C++のソース内にある関数を
C側でも使うための作業としては、
これだけでいいのでしょうか?
今回作成した
「C++」のソースと「C」のソースは、
全然違うディレクトリにそれぞれ存在しているのですが、
それぞれは、認識され合うものなのでしょうか?
お互いのコンパイルにあたってオプションを指定するか、
Makefileで書き換えるべき部分があるのでしょか?
笑ってしまうよな質問でしたらすいませんが、
アドバイスいただけるとありがたいです。
宜しくお願い致します。
No.3ベストアンサー
- 回答日時:
> C++のソース内にある関数を
> C側でも使うための作業としては、
> これだけでいいのでしょうか?
ダメです。
まず、CでもC++でも使える型しか、引数や返却値に使うことができません。また、ポインタを返す場合は、呼び出し側でdeleteしないといけないようなものは、別途解放の手段を用意しなければなりません。
次に、C++の関数型例外が送出される可能性がある場合、それを内部で捕捉してエラーコードか何かに置き換えてやらなければなりません。
さらに、リンクの際には、処理系によってはC++のための何らかの設定等が必要になる場合があります。
No.4
- 回答日時:
オブジェクトファイルをリンカにかけるときに、
C側に「-lstdc++」オプションを付けてあげてるかな?
C++では「libstdc++」が自動でリンクされるが、
Cでは、そうは行かんからな。
コンパイルの段階では、あとは皆さんのおっしゃる通りかと。
そんなところじゃないかな。
No.2
- 回答日時:
あくまで理論的にはそれだけです. もちろん「全然違うディレクトリにそれぞれ存在している」ならそれなりにしなければならないことはありますが, それは「C か C++ か」という問題とは独立です. 全て C で (あるいは C++ で) 書いているとしてもやることは同じ.
ディレクトリ構成やファイルの配置, あるいは「現在の Makefile」などがあれば, 「こうした方がいい」とかアドバイスできるかもしれません (もちろん「やっぱり手におえない」ということもありえる).
No.1
- 回答日時:
やりたい事が今ひとつ分かりません。
「extern "C"」というのは、「この関数はC言語のリンケージ規約でコンパイルされた物」だと言う事をコンパイラ及びリンカに教えるための宣言です。
「extern "C"」が何故あるのかというと、C言語とC++ではリンケージ規約が違うからです。
どういう事かというと、同じ関数宣言でもC言語とC++とでそれぞれ生成されたオブジェクトファイルを比較するとリンクするための形式が異なります。
なので、C言語でコンパイルされた関数(オブジェクトファイル)をC++側から使おうとした場合に「extern "C"」をつけてC言語の規約でリンクする必要がある事を教えるわけです。
逆にC言語側からC++の関数を使おうとした場合の方法については、うーん、あまりメリットがないので調べた事がありません。
それでも調べて欲しいという事であれば、調べてみましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語でヘッダファイルにグロー...
-
VBAを何回も作り直して、容量が...
-
” OS ビルド ” の意味が分か...
-
エクセルVBAではRound...
-
「fatal error C1189」を回避す...
-
ソースコードの隠蔽
-
外部シンボル "_main"は未解決です
-
1 つ以上の複数回定義されてい...
-
C++コンパイル時に『 C1083: in...
-
CImageクラスの使用について
-
ILSpyで、デコンパイルできない。
-
includeと#include
-
Makefile作成時の拡張子.oとは?
-
セミコロンについて
-
gccの「-l」オプションとライブ...
-
windowsでLinuxで作成したソー...
-
<math.h>があるのにsqrtが・...
-
マクロ コンパイルがグレーバック
-
Fortran : 複数の.fファイルの...
-
RPGでプログラムからソースファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
” OS ビルド ” の意味が分か...
-
VBAを何回も作り直して、容量が...
-
エクセルVBAではRound...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
C言語でヘッダファイルにグロー...
-
ILSpyで、デコンパイルできない。
-
<math.h>があるのにsqrtが・...
-
外部シンボル "_main"は未解決です
-
マクロ コンパイルがグレーバック
-
セミコロンについて
-
コンパイルエラー:ユーザ定義...
-
【VC++6.0(MFC)】警告「LINK : ...
-
1 つ以上の複数回定義されてい...
-
VB6とInputManソフトの関係
-
C言語でmからnまでの合計を求め...
-
ExcelVBAで『ByRef 引数の型が...
-
コンパイルに失敗しました、と...
-
漢字のコメントをはずすとコン...
-
C言語のコンパイルができません
おすすめ情報