プロジェクトをCで実装したいのですが、プロジェクトの一部をC++でコーディングしてから、メインのCコードから呼び出すのが快適です。
出来ますか?!はいの場合、どうすればできますか?
前もって感謝します :)
PS OpenCVなどのC++
コード
でいくつかのライブラリを使用しました。
プロジェクトをCで実装したいのですが、プロジェクトの一部をC++でコーディングしてから、メインのCコードから呼び出すのが快適です。
出来ますか?!はいの場合、どうすればできますか?
前もって感謝します :)
PS OpenCVなどのC++
コード
でいくつかのライブラリを使用しました。
C++ インターフェイスを通常の C 関数で「ラップ」する必要があります。この関数は、呼び出されるオブジェクトを示すパラメーターを受け取ります。たとえば、C++ の場合
class A
{
// .. boilerplate stuff...
int SomeMethod(int n, float f);
};
それと一緒に、次のような関数を宣言できます
extern "C" int A_SomeMethod(void* Obj, int n, float f)
{
return(((A*)Obj)->SomeMethod(n, f));
}
void* のキャストに慣れていない場合は、不透明なハンドルからA*
. しかし要点は、メソッドが呼び出されるオブジェクトへのハンドル/ポインターを保持する必要があるということです。ポインター/ハンドルを取得するには、割り当てを次のようにラップする必要があります。
extern "C" void* A_Instantiate()
{
return new A;
}
C++ ファイルは、上記の関数を含むファイルとは別にコンパイルする必要があります。C コンパイル用の個別のインクルードには、上記のすべての関数の宣言を含める必要があります。
編集: 以下の警告とコメントは重要です。「はい、C から C++ を呼び出すことは可能です」という質問に答えるには、これが 1 つのアプローチです。実際には機械的な方法がないため、完全なアプローチではありませんが、それは出発点です。delete
また、などの別のコールスルーを作成することを忘れないでください。
厳密に要求されない限り、これは羊毛で染められたマゾヒストのみが対象です。それを行うには、両側で細心の注意を払う必要があり、今日はうまく機能し、次のコンパイラの更新で見事に爆発する可能性があります。C ++には多くのランタイムヘルプが必要であり、Cからそれを確実に機能させることは通常サポートされていません。公式にサポートされている(および標準の一部など)C++からCを呼び出すことができますextern "C"
。
おそらく最善の策は、CとC ++によって処理されるサブセットにCを記述し(微妙な違いの出発点はこれです)、C++コンパイラーでコンパイルすることです。またはそれを乗り越えて、あなたが最も好きな言語を決定してください。
はい、次のように指定する必要があります
外部「C」
このようにして、関数が「C」リンケージを持つようになり、C コードは C であるかのように関数を呼び出すことができます。C はオーバーロードをサポートしていないため、この関数名はマングルされません。
ここで@Faisal Valiを引用させてください:
Q: 自分の C コードに C++ からアクセスできますか、またはその逆はできますか?
A: はい。
1) 主なことは、次のようextern "C" { ...}
に、すべてのヘッダーで 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++ の混合に関する良い FAQ は次のとおりです。