CからC++の関数呼び出しでコンパイルエラーが発生しています

このQ&Aのポイント
  • CからC++の関数を呼び出して値を取得したいが、コンパイルエラーが発生している。
  • externキーワード内でfuncBがスコープにないというエラーが出ている。
  • ラッパ関数を使用する方法について教えてほしい。他にも良い方法があれば教えてほしい。
回答を見る
  • ベストアンサー

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はスコープにありません?のようなエラーが出てしまいます。 ラッパ関数を使って使用するなどと聞いたのですが、やり方がいまいちわかりません。 どうか教えていただけますでしょうか。 また、他にやり方があるかと思いますが、いいやり方があれば教えていただけると幸いです。 以上です、よろしくお願いいたします。 不足内容あれば指定願います。

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

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をどこで作って記録させるか(そして、必要なら解放させるか)を考える必要があります。

jam118
質問者

お礼

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

その他の回答 (3)

回答No.4

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

jam118
質問者

お礼

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

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>externしている箇所でfuncBはスコープにありません?のようなエラーが出てしまいます。 回答ではありませんが エラーメッセージを書くときは原文をそっくりそのまま書きましょう。 そのエラーの意味がわかってない人が意訳できるわけありませんから伝言ゲームになるだけです。

jam118
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

funcA に書いてある funcB と clsB::funcB は全くもって無関係だしねぇ.... そもそも clsB::funcB を呼び出すための (clsB の) インスタンスはどうやって渡すつもりなの?

jam118
質問者

補足

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

関連するQ&A

  • C/C++ return文で関数の返却値を返却

    まず、処理がエラーだと-1を返し、正常だと0を返す関数が2つあり、それぞれint funcA()、int funcB()とします。 この時、それらとは別の関数で以下のようにreturn文を書くとどのように値を返しますか? return funcA() || funcB(); 共に0を返す時、どちらかが0を返し他方は-1を返す時、共に-1を返す時についてご教示願います。 またあえてこのように記述するくらいならノーマルに以下の記述の方が良いですか? if (funcA() != 0 || funcB() != 0 ) { return -1; } else { return 0; } (インデントしていないので読みづらかったらすみません)

  • C言語で、記憶クラス指定子extern・staticを関数に指定

    C言語の本に、「関数の定義と呼び出す側が別ソースファイルの場合、プロトタイプはヘッダーファイルに書き、定義側と呼び出し側の両方でインクルードしましょう」ということが書かれていました。 例えば、 ===code1a.c=== extern void funcB(int); static void funcA() { funcB(1); } ===code1b.c=== void funcB(int a) { printf("%d\n",a); } このような場合には、もしcode1b.cの中の関数funcBに引数を追加した場合、再コンパイルしても気づかないのでよくない。 そこで、次のようにヘッダーファイルを作り、プロトタイプはそこに書くべきだ。 ***code2b.h*** extern void funcB(int); ***code2a.c*** #include "code2b.h" static void funcA() { funcB(1); } ******code2b.c**** #include "code2b.h" void funcB(int a) { printf("%d\n",a); } 記述は以上のようなことです。 #include "code2b.h" とは、 extern void funcB(int); が書いてあるのと同じだと思います。 私が思ったのは、本の勧める方法では、 funcBを定義しているcode2b.cで、プロトタイプの記憶クラス指定子が、externになっているが良いのか(externとは、別のソースファイルで定義されているという意味ではないか)ということです。 extern, staticは、プロトタイプに書くべきなのか、関数の定義に書くべきなのか、も両方に書くべきなのでしょうか。 私の処理系では、 ・プロトタイプ宣言でexternを付けて関数定義でstaticを付ける、 ・staticを付けた関数を他のソースファイルで呼ぶ、 などの明らかに矛盾する場合は、コンパイルエラーになります。 でも、extern単独での役割はなさそうです。 他の処理系でも同じでしょうか。 (main等省略)

  • C言語での単体テストの作成について質問です。

    C言語での単体テストの作成方法がわからずに困っています。 以下のようなA.cの中のFuncA関数のテストを作成しています。 /*** A.c ********************/ #include "B.h" int FuncA (int n) { int temp; if (FuncB() == true) temp = n * 2; else temp = n / 2; return temp; } /****************************/ FuncA関数は中でB.c内のFuncB関数を読んでいますが、 これは、B.h、B.cに定義されている関数です。 このFuncB関数は本物のソースを使用せず、スタブを使用してテストを作成しています。 FuncB関数のスタブは以下のように考えています。 /*** BStub.h ********************/ extern bool retVal extern bool FuncB_Stub(void); /******************************/ /*** BStub.c ********************/ #include "BStub.h" bool retVal; bool FuncB_Stub(void) { return retVal; } /******************************/ できる限り、A.cに単体テスト用のコードを埋め込まずにテストを作成したいのですが、 FuncA関数がFuncB関数ではなく、BStubのFuncB_Stub関数を呼び出すようにするには どのようにしたらよろしいでしょうか?

  • bsearch関数の呼び出しで

    C言語の深いところまで理解しようとしてます。今まで使わないだろうと思っていた関数へのポインタ なのですが、 2分探索のところで bsearch関数というのが出てきました。 この関数は第5引数に比較関数を引数にするのですが p = bsearch(&ky, x, nx, sizeof(int), (int (*)(const void *,const void *))int_cmp ); という形でサンプルソースには載っています。 この (int (*)(const void *,const void *))int_cmp の部分なのですが、まず戻り値をキャストするなら int (*)ではなく(int *)ではないでしょうか。 それとint_cmpは比較関数なのですが、引数が左側に来る、というところが納得できません。 ちなみにソースファイルをcppのままだとコンパイルできませんでした.cに拡張子を直したらコンパイルできました。 説明が足りないところがあったら指摘してください。お願いします。

  • Borland C++ Compiler 5.5の警告について

    Borland C++ Compiler 5.5を使用してコンパイルしているのですが、 下記のソースをコンパイルするとエラーがでます。 #include <stdio.h> ------test.c------ int main(void) { int a; int b=0; b = a; return 0; } 警告 W8004 error.c 6: 'b' に代入した値は使われていない(関数 main )という警告なのですが、初期化をしている変数すべての警告がでてしまい困っています。 この警告だけを表示させない方法等あるのでしょうか?

  • C++の関数をCで呼ぶには??

    C++の関数をCで呼ぶには、「extern C」を使用することが有名だと思いますが、これだとC++で記述したソースコードにextern Cを追加することにあると思います。 では、C++のほうはまったく手をつけず、C++の関数をCで呼ぶことは可能なのでしょうか? 知っている方がいましたらよろしくお願い致します。

  • 単体テスト スタブ作成に関して

    同一ファイル内にテストする関数とその関数から呼び出される関数があった場合、どのようにスタブは作成すればいいのでしょうか? test.c ------------------------------ funcA(){ //funcA()のテスト funcB(); } funcB(){ } //funcB()のスタブを作りたいが同じファイルにあるため自動的に本物の関数がリンクされてしまう。 ----------------

  • C言語 extern について

    どうもこんにちは C言語でプログラムを作っています。 複数のファイルから1つのプログラムを作っていますが、あるファイルで実装した関数を別のファイルから使用する際、単にプロトタイプ宣言を行うだけでなく、extern が必要なのでしょうか? 今までは extern を使用せず、以下のように書いてました。 // main.c ファイル int func_sub(); int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } これは extern を使用して、このように書かないとだめなのでしょうか? // main.c ファイル extern int func_sub(); // このexternは必要? int func_main() { return func_sub() * 2; } // sub.c ファイル int func_sub() { return 10; } 大域変数を他のファイルでも使用する場合はexternが必要ですが、関数に関してもexternを使用しなければならないのでしょうか?

  • C言語:引数の型だけ異なる関数を一つにまとめる方法

    以下の引数の型だけ異なる関数を、どうにかして一つにまとめたいのですが、 何か良い方法はないでしょうか? void funcA(_MNGR_TAG mngr){ 処理X; } void funcB(_COPY_MNGR_TAG mngr){ 処理X; } 補足: ・_NODE_TAGと_COPY_NODE_TAGは構造体です。ただし中身は異なります。 ・(引数名が同じため)funcAとfuncBで行っている処理は全く同じです。 注意事項: 関数テーブルやC++言語を使用する方法は除いて下さい

  • extern "C" の利用方法に関して

    皆さんこんにちは。 extern "C"使って、 C++に書いてある関数をCでも使おうと、 もがいている最中の者です。 C++側のソース内にある、 Cでも使いたい関数に「eztern "C"」をつけ足しコンパイルに成功しました。 これから、C側でも、 C++から引用したい関数にexternをつけて、 コンパイルをしてしまおうとは思っているのですが、 C++のソース内にある関数を C側でも使うための作業としては、 これだけでいいのでしょうか? 今回作成した 「C++」のソースと「C」のソースは、 全然違うディレクトリにそれぞれ存在しているのですが、 それぞれは、認識され合うものなのでしょうか? お互いのコンパイルにあたってオプションを指定するか、 Makefileで書き換えるべき部分があるのでしょか? 笑ってしまうよな質問でしたらすいませんが、 アドバイスいただけるとありがたいです。 宜しくお願い致します。

専門家に質問してみよう