こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

CからC++の関数呼び出し

CからC++の関数を呼び出して値を取得したいのですが、コンパイルエラーになってしまいます。
呼び出す関数内でさらに同じクラスの関数を呼び出して値をreturnしたいだけなのですが、
ご教示願います。

ソースは下記のような感じです。

Cソース(AAA.c)
main(){
・・・・・
if ( funcA() ){
・・・・
}
}

C++ソース(BBB.cpp)
int clsB::funcB {
return iflg;
}

extern "C" {
int funcA() { return funcB(); }
}
※上記externは特に何かの関数内に書いているわけではありません。


C++ヘッダ(BBB.hpp)
class clsB : public XXX {
private:
int iflg;
・・・・
public:
int funcB();
・・・・
}

上記にコンパイルすると、
externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。
ラッパ関数を使って使用するなどと聞いたのですが、やり方がいまいちわかりません。
どうか教えていただけますでしょうか。
また、他にやり方があるかと思いますが、いいやり方があれば教えていただけると幸いです。

以上です、よろしくお願いいたします。
不足内容あれば指定願います。

投稿日時 - 2014-07-01 23:37:03

QNo.8661386

すぐに回答ほしいです

質問者が選んだベストアンサー

C++のプログラムとしてextern C 無しで書いたとしても動かないものですから、extern Cを付けても同じです。

funA はclsBのメンバーではありません。
よって、その中のfuncBはclsB::funcBとは別のfuncBだと解釈されます。
> 呼び出す関数内でさらに同じクラスの関数を呼び出して
とありますが、「同じクラス」では無いのです。


funcB はclsBのインスタンスメソッドですから
clsB objB() ;
objB.funcB();

clsB *ptrB = new clsB() ;
ptrB->funcB();

という感じに、インスタンスが必要です。


> いいやり方があれば
と言われても、何が目的かわからないので、答えかねます。

funBが、インスタンスの情報をまったく使わないのであれば、funcBをstatic にして
int funcA() { return clsB::funcB() ; }
とします。
インスタンスの情報を必要とするなら
int funcA() { return objB.funcB() ; }
int funcA() { return ptrB->funcB() ; }
となります。
この場合、objB,ptrBをどこで作って記録させるか(そして、必要なら解放させるか)を考える必要があります。

投稿日時 - 2014-07-02 05:59:31

お礼

C++としても理解ができていないプログラムだったんですね。。
インスタンスとか実体とかC++は頭がごちゃごちゃしちゃいます。
ありがとうございました。

投稿日時 - 2014-07-03 00:47:01

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

AAA.c を AAA.cpp にしてしまえばすむことでは?

投稿日時 - 2014-07-02 22:45:55

お礼

それは・・・やりたいこどではないので。。。
ご回答ありがとうございます。

投稿日時 - 2014-07-03 00:49:17

ANo.2

>externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。

回答ではありませんが
エラーメッセージを書くときは原文をそっくりそのまま書きましょう。

そのエラーの意味がわかってない人が意訳できるわけありませんから伝言ゲームになるだけです。

投稿日時 - 2014-07-02 00:50:11

お礼

おっしゃる通りです。
すいませんでした。

投稿日時 - 2014-07-03 00:44:53

ANo.1

funcA に書いてある funcB と clsB::funcB は全くもって無関係だしねぇ....

そもそも clsB::funcB を呼び出すための (clsB の) インスタンスはどうやって渡すつもりなの?

投稿日時 - 2014-07-02 00:20:36

補足

ご回答ありがとうございます。
無関係なんですか。。。どうしたらいいんでしょうか。。
staticにする?
すいません。わかりません。。

投稿日時 - 2014-07-02 00:27:52

あなたにオススメの質問