私はCでプロジェクトを実施したいが、C++でプロジェクトの一部をコード化し、メインCコードからそれらを呼び出すために快適です。
可能ですか?はいの場合、どうすればいいのですか?
ありがとうございます。CコードでC++関数にアクセスするにはどうしたらいいですか?
P.S.
私はのC++コードにいくつかのライブラリを使用しました。OpenCVのようなコードです。
私はCでプロジェクトを実施したいが、C++でプロジェクトの一部をコード化し、メインCコードからそれらを呼び出すために快適です。
可能ですか?はいの場合、どうすればいいのですか?
ありがとうございます。CコードでC++関数にアクセスするにはどうしたらいいですか?
P.S.
私はのC++コードにいくつかのライブラリを使用しました。OpenCVのようなコードです。
あなたのCを「ラップ」する必要があります++何物彼らを示すために、パラメータを取る通常のC関数とのインタフェース頼まれるだろう。あなたがC++
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
に持っている場合たとえば、それに伴い、あなたがvoid *のキャストに慣れていないなら、あなたができるように
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
としての機能を宣言することができ不透明なハンドルからある種のマップをA*
に実装します。しかし、要点は、メソッドが呼び出されるオブジェクトへのハンドル/ポインタを保持する必要があることです。 C++ファイルは上記の機能を持つファイルとは別にに沿ってコンパイルする必要があります
extern "C" void* A_Instantiate()
{
return new A;
}
:ポインタを取得するためには/あなたに割り当てをラップする必要がありますハンドル。 Cコンパイル用の別のインクルードには、上記のすべての関数の宣言を含める必要があります。
編集:下記の警告とコメントは重要です。 "はい、CからC++を呼び出すことは可能です"という質問に答えるには、これが1つの方法です。それは実際にそれを行うための機械的な方法がないので完全なアプローチではありませんが、それはスタートです。また、など、など、別のコールスルーdelete
用を作成することを忘れないでください
はい、あなたは
にextern「C」
それはその後、Cのコードはちょうどあなたの関数を呼び出すことができ、機能は「C」リンケージを持つようになります。この方法として指定する必要がありますこの関数名は、Cが過負荷をサポートしていないので、そのときには変換されません。ここ
私は@Faisal VALI引用してみましょう:
これはC互換関数(オーバーロードされた関数の_one_バージョン、これはオーバーロードがまったく処理されていても、参照もなく、クラスやオブジェクトのメンバ関数でもなく、内部的にオブジェクトやクラスを使用できます)_only_多くの制限があります)。これは標準の意図ではなく、C++からCに呼び出すことができます。 C++/Cツールチェーンでは許可されないことさえあります。 – vonbrand
Q:私は私のCコードがCからアクセスする++、またはその逆はできますか?
A:はい。
1)主なものは次のように、C-のみの機能やデータを示すために、すべてのヘッダーにextern "C" { ...}
を使用することです:
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
/* Header file foo.h */
#ifdef __cplusplus /* If this is a C++ compiler, use C linkage */
extern "C" {
#endif
/* These functions get C linkage */
void foo();
struct bar { /* ... */ };
#ifdef __cplusplus /* If this is a C++ compiler, end C linkage */
}
#endif
2)通常のシナリオでは、C++のメインでありますCとC++の関数と構造体の組み合わせを呼び出すプログラムです。構造体と関数はすべてヘッダーで宣言され、すべてに "#ifdef __cplusplus/extern C"があります。
3)ここでは、CおよびC++の混合には良い質問です:
は厳密を必要な場合を除き、これが唯一のdyied・イン・ウールマゾのためです。これを行うと、両側で極度の注意を払う必要があり、今日はうまくいって次のコンパイラのアップデートで爆発的に爆発する可能性があります。 C++は多くのランタイム・ヘルプを必要とし、Cから確実に動作するようにすることは通常サポートされていません。公式にサポートされているC++(標準の一部、extern "C"
など)からCに呼び出すことができます。
おそらく、CとC++(微妙な違いの起点はthis)によって処理されるサブセットにCを書いて、C++コンパイラでコンパイルするのが最善の方法でしょう。または、それを乗り越えて、あなたが最も好きな言語を決めてください。
ありがとうwilsonmichaelpatrickですが、私のCプログラムでコンパイルされた* C++コードを使用するのはどうですか? – S0H31L
'Obj'をキャストするときに使われる' A'とは何ですか?それはあらかじめ定義された型か構造体ですか? – S0H31L
'A'はC++クラス型です。コンパイルされたC++コードであっても、このアプローチが有効です。上で説明した行に沿ってextern "C"メソッドを定義し、それらを使ってC++コードを呼び出します。 C++コード自体は変更されません。 – wilsonmichaelpatrick