トップページ⇒tech
20コメント7KB

CからC++を呼び出すには?

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
main関数がC言語で書かれている場合に、
C++で書かれた関数を使うことは可能で
しょうか?

どんなやり方でもいいので、教えてください。
0002デフォルトの名無しさんNGNG
>>1
extern "C" {
/*〜C++のパブリックなインタフェース*〜/
};
0003デフォルトの名無しさんNGNG
それはマングリングを防ぐためのものですよね?

試してみてダメだったと思うのですが・・・

もう一回やってみます。
00042NGNG
extern"C"の中に thisを使うクラスメソッドなんか
置いても駄目だからね>1
Cで認識する普通の関数形式を記述の事。
0005デフォルトの名無しさんNGNG
gcc/g++と推測。

-lstdc++ を付加とか。
0006デフォルトの名無しさんNGNG
COMではいかんの?
obj->lpVtbl->method() をつかって。
0007デフォルトの名無しさんNGNG
>>4
> extern"C"の中に thisを使うクラスメソッドなんか

関係ないツッコミだけど一般に「クラスメソッド」と言った場合、
「インスタンスメソッド」に対する言葉で、クラスメソッドとは
C++ で言えば static なメンバ関数のことをいう。
従ってクラスメソッドには this は渡されない。
00081NGNG
>>5
そうです。gccです。

明日試す予定です。

C++用のライブラリはちゃんとリンクしたと思うので、大丈夫だと思うのですが。

とりあえず結果は明日報告します。

>>6
環境が環境なので〜〜
0009デフォルトの名無しさんNGNG
クラスのメンバ関数をCから呼び出したい場合、いちばん簡単なのは
そのメンバ関数をstatic宣言してしまえばよい。
当然static宣言されたメンバ関数はインスタンスで共用されるので
注意が必要。
って、質問の内容と違うかな?
0010デフォルトの名無しさんNGNG
>>9
> クラスのメンバ関数をCから呼び出したい場合、いちばん簡単なのは
> そのメンバ関数をstatic宣言してしまえばよい。

で、それをどうやって C から呼ぶのかな?
mangle って何だか知ってる?
0011デフォルトの名無しさんNGNG
なんでもいいけど C++ は C の文法を含んでるんだから、main 側も含めて
ソースがあるものは全部 C++ でコンパイルするのが一番簡単じゃないかな。
それならリンケージで悩む必要もないし。

ソースがない関数だけ extern "C" すればよいことだし。
00121NGNG
試して思い出した。

リンクで失敗してるんじゃなくて、それ以外の原因だった・・・鬱だ。

何やらmips1とかmips3がどうこう、と出るのです。

後、切り詰められた?みたいなメッセージが。


元々のプロジェクトが膨れ上がっている状態なので、
とても原因を探す気にならない・・・鬱だ。
00131NGNG
>>11
C++はCに比べてポインタの型チェックが厳しいので、
昔いや〜んな思いをしたことがあるのです。
NULL、void *が使われてるあたりで、ひっかかることが多いはず。

しかも自分が書いたソースじゃないので・・・
00145NGNG
>>13
いや〜んって言う前に、C++コンパイラが何を伝えようとしている
のか考えたほうがいいと思うぞ。
まぁ、いや〜んな(というかキャストが煩雑になる)シーンは無
いとはいわんが。関数ポインタ周辺とか。

>>12
全然わからん。
そのまま貼れって。ファイル名やクラス名を適当に書き換えれば
問題なかろ。

#俺が答えられるかどうかは知らんけどねー。
0015デフォルトの名無しさんNGNG
適当にファイル名を変えたりしてるけど、こんな感じ。
ちなみにクロスコンパイル環境でやってマッスル。
コンパイラ自体を間違えてる、ということは無いとは
思うが・・・ちゃんと確認したかどうか覚えてない・・・

C++に書き直すは確実ですが、元のソースがCVSで管理されて
いるので、登録し直すのも面倒。ファイルが100以上あることを
考えると、キャストの部分を書き直すのすら面倒なのです。

collect2: ld terminated with signal 11 [セグメンテーション違反です], core dumped
〜〜/bin/ld: file_A.o: ISA mismatch (-mips1) with previous modules (-mips3)
Bad value: failed to merge target specific data of file lib_A.a(file_A.o)
lib_A.a(file_A.o): In function `FunctionTest':
file_A.o(.text+0x8): relocation truncated to fit: R_MIPS_16 data
file_A.o(.text+0x10): relocation truncated to fit: R_MIPS_16 data
file_A.o(.text+0x1a): relocation truncated to fit: R_MIPS_16 data
file_A.o(.text+0x2a): relocation truncated to fit: R_MIPS_16 data
make: *** [target.elf] Error 1
0016デフォルトの名無しさんNGNG
単発スレにレスするお前等の神経が(以下略)>>1-15
0017nat241.ayu.ne.jpNGNG
test
0018デフォルトの名無しさんNGNG
>>17 見〜つけた!
0019デフォルトの名無しさんNGNG
るbyさいこー
17さらしあげぁ
0020デフォルトの名無しさんNGNG
てすとてすとてすと
■ このスレッドは過去ログ倉庫に格納されています