• ベストアンサー

CからC++の関数を使用するには

C++からCの関数を参照する場合は extern "C"{ void test(void); } などと定義すれば可能なのですが、逆に C++で定義した関数をCで使うにはどのようにすれば よいのでしょうか?

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

  • ベストアンサー
noname#5537
noname#5537
回答No.1

> C++で定義した関数をCで使うにはどのようにすれば > よいのでしょうか? C++ のソースのほうで, extern "C" をつけておけば,C から呼ぶことが出来ます。 当然メンバ関数は(この方法では)呼べません。

shirose
質問者

お礼

うまくいきました! ありがとうございました。

関連するQ&A

  • 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++の関数(DLL)を呼ぶ方法について

    C++関数からCの関数を呼ぶには extern "C" を使うのはわかるのですが C関数からC++の関数を呼ぶ方法がわかりません。 『外部参照 1 が未解決』になってリンクが出来ません。 ちなみにC++の関数はDLLで、他のC++関数からは呼ぶことも実行出来ることも 確認済みです。 よろしくお願いします。

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

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

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

  • C言語での関数の引数の受け渡しについて

    C言語での関数の引数の受け渡しについて教えてもらいたいのです。 char *p=Goo;  というポインタpがmain関数で定義され、このポインタpをある関数 void func(・・・) に渡すことは出来ますか? つまりポインタを実引数として扱うことはできるのかという事ですが・・・ int p=10; とかだったら、 void func(int test) の関数には、main関数で func(p) で仮引数testにわたせると思うんですが・・・ もし出来るようでしたら、関数の渡し方と定義の記述を教えてください。 どうか宜しくお願いします。

  • 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関数を呼び出すようにするには どのようにしたらよろしいでしょうか?

  • JNAでc言語ファイルの読み込み方が分かりません

    JNAでc言語ファイルの読み込み方が分かりません JNAを使用して、javaからcを読み込み動作するプログラムを作っています。 なんとなく定義は分かってきたのですが、 javaのソースコードに CLibrary.INSTANCE.printf(); のように、c言語を書き込んでいる状況なのですが、 JNAを利用した.javaファイルから.cファイルを読み込む方法はありますか? c言語の場合、.cファイルごとに分割された関数をmainが呼び出すとき、 extern void Sample(); とプロトタイプ宣言の後に Sample(); で呼び出せるみたいなので、 これを使って、 CLibrary.INSTANCE.extern void Sample(); とやってみましたが、コンパイルできませんでした;; 他にやり方がありますか? 知ってる方がいらっしゃいましたら、教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスを使ったC++の関数をCで呼び出すには?

     QNo.152285と類似の質問になりますが、独自に用意したクラスを内部で使用し、extern "C" を宣言した、C++の関数をCプログラムから呼び出し、Cコンパイラでリンクすることを考えています。  この場合、C++関数内で使用されるクラスについても、extern "C"の記述が必要でしょうか?  またその記述の仕方はどのようになるでしょうか?  あるいは、そういったことはできないのでしょうか?(coutが使えることを考えると、できないわけではないとも思っていますが)  あるいは、コンパイルの際の、オプションなどで解決できるでしょうか?  クラスはnewで生成して使用しています。 環境はソラリスのCCとccを使っています。 どうか、ご回答よろしくお願いします。

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

  • 関数内に関数は無理でしょうか? 子スレッド

    CやC++についてまだよくわかっていないのですが、関数内に関数を書くと 「コンパイラ エラー C2601 ローカル関数の定義が正しくありません。」となります。 そこで以下の子スレッドのように関数を関数外に定義して、利用する変数も関数外に定義しました。 変数を外部に定義すると、メモリアクセスになるので、できるだけ避けたかったために 関数内に子スレッドを最初書いていたのですが、何か良い方法はありますか? 子スレッドの引数や戻り値を利用できればいいのですが、そんなことできるのかもわかりません。 あと、関数を配列のように定義できるのでしょうか? test_thread_0, test_thread_1と逐一書くのが面倒です。 int sum1 = 0, sum2 = 0; unsigned __stdcall test_thread_0(void *lpx) // lpxはおまじない? { // 全て足す for (int i = ST1; i <= EN1; i++){ sum1 += Data1[i] * Data2[i]; } return 0; // 正常という意味? } unsigned __stdcall test_thread_1(void *lpx) { // 全て引く for (int i = ST2; i <= EN2; i++){ sum2 -= Data1[i] * Data2[i]; } return 0; }

専門家に質問してみよう