2013-03-16 9 views
6

私はCでプロジェクトを実施したいが、C++でプロジェクトの一部をコード化し、メインCコードからそれらを呼び出すために快適です。
可能ですか?はいの場合、どうすればいいのですか?
ありがとうございます。CコードでC++関数にアクセスするにはどうしたらいいですか?

P.S.
私はのC++コードにいくつかのライブラリを使用しました。OpenCVのようなコードです。

答えて

4

あなたの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用を作成することを忘れないでください

+0

ありがとうwilsonmichaelpatrickですが、私のCプログラムでコンパイルされた* C++コードを使用するのはどうですか? – S0H31L

+0

'Obj'をキャストするときに使われる' A'とは何ですか?それはあらかじめ定義された型か構造体ですか? – S0H31L

+0

'A'はC++クラス型です。コンパイルされたC++コードであっても、このアプローチが有効です。上で説明した行に沿ってextern "C"メソッドを定義し、それらを使ってC++コードを呼び出します。 C++コード自体は変更されません。 – wilsonmichaelpatrick

0

はい、あなたは

にextern「C」

それはその後、Cのコードはちょうどあなたの関数を呼び出すことができ、機能は「C」リンケージを持つようになります。この方法として指定する必要がありますこの関数名は、Cが過負荷をサポートしていないので、そのときには変換されません。ここ

私は@Faisal VALI引用してみましょう:

  • にextern "C" はリンケージ仕様すべてのコンパイラが提供するを必要ある
  • "C" リンケージである
  • リンケージ指定が発生するもの名前空間のスコープでのみ
  • すべての関数型、関数名、および変数名には言語リンケージがあります
  • 異なる言語型の2つの関数型他の点では同一
  • リンケージスペック巣は、内側のは、「C」を有することができ、特定の名前を持つ多くても1つの関数でクラスメンバー
  • では無視され、最終的なリンケージ
  • のextern「C」を決定する場合でも、GE結合は異なるタイプであります(静的にすることはできません)
  • extern "C"は関数に外部リンケージを強制しません(静的にすることはできません)。C++から他の言語で定義されたオブジェクトや、定義され、言語に依存します。 2つのだけの言語の実装のオブジェクトレイアウト戦略は十分に似ているところは、そのような結合は、
  • を達成することができ

see Faisal Vali answer here

+0

これはC互換関数(オーバーロードされた関数の_one_バージョン、これはオーバーロードがまったく処理されていても、参照もなく、クラスやオブジェクトのメンバ関数でもなく、内部的にオブジェクトやクラスを使用できます)_only_多くの制限があります)。これは標準の意図ではなく、C++からCに呼び出すことができます。 C++/Cツールチェーンでは許可されないことさえあります。 – vonbrand

0

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++の混合には良い質問です:

http://www.parashift.com/c++-faq/mixing-c-and-cpp.html

+2

私が読んだところから:これはC言語のコードを呼び出そうとしているCのプロジェクトであり、C関数を呼び出すC++プログラムのように答えています。 – qdii

+0

@ paulsm4:あなたの返信ではtnxですが、qdiiは正しいです:) – S0H31L

0

は厳密を必要な場合を除き、これが唯一のdyied・イン・ウールマゾのためです。これを行うと、両側で極度の注意を払う必要があり、今日はうまくいって次のコンパイラのアップデートで爆発的に爆発する可能性があります。 C++は多くのランタイム・ヘルプを必要とし、Cから確実に動作するようにすることは通常サポートされていません。公式にサポートされているC++(標準の一部、extern "C"など)からCに呼び出すことができます。

おそらく、CとC++(微妙な違いの起点はthis)によって処理されるサブセットにCを書いて、C++コンパイラでコンパイルするのが最善の方法でしょう。または、それを乗り越えて、あなたが最も好きな言語を決めてください。

+0

ありがとう、私のCプログラムでコンパイルされたC++コードを使うのはどうですか? P.S:*厳密に必要です!*:s – S0H31L

+0

C++コンパイラでコンパイルしてください。それ以外は狂気です。 C++を使用しない理由は、言語に関連する問題(プログラマが言語を知らない、ポリシーに対して、非効率的であると考えられる)、または実行時の要件のためです。最初のものは解決でき、C++を一様に使用できます。とにかく言語混合による余分な問題は別として、あなたはキマイラで支払う2番目の費用です。 – vonbrand

関連する問題