プロが教えるわが家の防犯対策術!

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

A 回答 (3件)

一般的には不可能です。

既存のC++コードを修正することなく、Cから呼び出すには、

extern "C++" void f();

extern "C" int call_f() throw()
{
 try
 {
  f();
 }
 catch (...)
 {
  return -1;
 }
 return 0;
}

のようなラッパー関数を作り、それを呼び出す必要があります。

なお、C++の関数のマングル名を調べて強引に呼び出すことも、場合によっては可能ですが、処理系によってはC++結合とC結合のコーリングコンベンションが異なる場合があるので要注意です。また、仮に問題なく呼び出せたとしても、C++の関数から送出された例外を処理することができませんので、破綻するのは目に見えています。

この回答への補足

 現在,C++言語で記述された下位ライブラリから、C言語で関数を呼び出さなければならない状態にあります。
 しかし、下位のライブラリがMinGWで実装されたものであり、.soファイルや.oファイルなどのライブラリファイルとC++ソースコードからなるという複雑な構造をしています。
 しかも、上位のC言語プログラムはVisual Studioで動作させなければなりません。
 どのようにすればこのような要求を満足できるソードを作成できるかを教えていただければ幸いです。

補足日時:2007/12/26 21:18
    • good
    • 0
この回答へのお礼

jactaさん、回答ありがとうございます。

やはり、C++の方にextern Cを記述したほうがよいのですね。

お礼日時:2007/12/26 18:33

cのソースをc++としてコンパイルするのはだめなのですか?



GNUなら以下のコードで
gcc source.c では通りませんが、
g++ source.c なら通ります。

分割してあったとしても同様です。

#include<stdio.h>
int sub(int a){
 return a;
}

int sub(int a, int b){
 return a + b;
}

int main(){
 printf("%d\n", sub(1));
 printf("%d\n", sub(1, 2));
}
    • good
    • 0
この回答へのお礼

luckymakoさん、回答ありがとうございます。
自己解決いたしました。

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

お礼日時:2007/12/29 06:53

> しかし、下位のライブラリがMinGWで実装されたものであり、.soファイルや.oファイルなどのライブラリファイルとC++ソースコードからなるという複雑な構造をしています。


> しかも、上位のC言語プログラムはVisual Studioで動作させなければなりません。

MinGWで実装されたものだけを集めてDLLを作ってください。
そして、エクスポートする関数は、すべてCのインタフェースを持たせてください。Visual Studioとのことですが、VB等からの呼出しのことも考えると、__stdcallにしておいた方が融通が利く可能性があります。その場合、引数や返却値の型にも十分注意を払ってください。

また、前回も書きましたが、C結合にするだけでは不十分で、例外処理をDLLの外に漏らさないように、内部ですべてcatchし、エラーコードに置き換える必要があります。

もう一点、long double型のサイズがMinGWとVisual C++では異なります。また、double _Complex型や_Bool型など、C99の型はVisual C++では使えませんので要注意です。
    • good
    • 0
この回答へのお礼

jactaさん、回答ありがとうございます。

やってみたいと思います。

お礼日時:2007/12/28 13:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!