5

プロジェクトをCで実装したいのですが、プロジェクトの一部をC++でコーディングしてから、メインのCコードから呼び出すのが快適です。
出来ますか?!はいの場合、どうすればできますか?
前もって感謝します :)

PS OpenCVなどのC++
コード でいくつかのライブラリを使用しました。

4

4 に答える 4

4

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また、などの別のコールスルーを作成することを忘れないでください。

于 2013-03-16T18:25:44.617 に答える
0

厳密に要求されない限り、これは羊毛で染められたマゾヒストのみが対象です。それを行うには、両側で細心の注意を払う必要があり、今日はうまく機能し、次のコンパイラの更新で見事に爆発する可能性があります。C ++には多くのランタイムヘルプが必要であり、Cからそれを確実に機能させることは通常サポートされていません。公式にサポートされている(および標準の一部など)C++からCを呼び出すことができますextern "C"

おそらく最善の策は、CとC ++によって処理されるサブセットにCを記述し(微妙な違いの出発点はこれです)、C++コンパイラーでコンパイルすることです。またはそれを乗り越えて、あなたが最も好きな言語を決定してください。

于 2013-03-16T19:12:48.823 に答える
0

はい、次のように指定する必要があります

外部「C」

このようにして、関数が「C」リンケージを持つようになり、C コードは C であるかのように関数を呼び出すことができます。C はオーバーロードをサポートしていないため、この関数名はマングルされません。

ここで@Faisal Valiを引用させてください:

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

ファイサル・ヴァリの回答はこちら

于 2013-03-16T18:24:34.270 に答える
0

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 は次のとおりです。

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

于 2013-03-16T18:24:40.403 に答える