1

別のCプログラムでC++で記述されたソフトウェアを使用しようとしています。

必要なコンポーネントを.libファイル内にコンパイルし、以下を使用していくつかのCコードを含めました。

#ifdef __cplusplus
    extern "C" {
#endif

このコードは、C呼び出し可能関数内のC++オブジェクトメソッド呼び出しをまとめたものです。オブジェクトはファイルスコープで宣言され、オブジェクトへのポインタは最初に取得され、後でメソッドを呼び出すオブジェクトを参照するために使用されます。例えば:

const void *GetHandle() {
    return (void *) &obj;
}

そして、メソッドを呼び出すには:

int GetInt(const void *handle) {
    Object *temp = (Object *) handle;
    return temp->getInt();
}

これは問題の有効な解決策ですか?現時点では、CプログラムのGetHandle()メソッドだけで、戻り値をいくつかのconst void *変数に割り当てようとすると、「エラーC2099:初期化子は定数ではありません」というエラーが発生します。


編集

問題を修正しました。私の標準Cの無知は、ここにあります。私はdsPIC用のMicrochipC30に慣れていますが、これは少し異なります。

関数の外部でポインタを宣言して初期化しようとしていました。私はそれらをconstとして設定しましたが、それは実際には必要ではないので、今は外部で宣言してからinit関数で初期化します。また、cppファイルのすべての関数の前にextern "C"を配置すると、すべてがコンパイルされます。だから、助けてくれたみんなに感謝します!

4

3 に答える 3

1

私があなたなら、COMオブジェクトを使用してすべてのC++機能をラップします。次のコードプロジェクトのデモを確認してください。

http://www.codeproject.com/Articles/13601/COM-in-plain-C

COMオブジェクトに精通していない場合は、最初にこの記事を読むことができると思います http://www.codeproject.com/Articles/633/Introduction-to-COM-What-It-Is-and-How-to-Use-それ

于 2012-08-09T11:51:39.493 に答える
1

これは有効な解決策です。

constただし、引数/戻り値/キャストの性質をより注意深く確認することをお勧めします。

たとえば、オブジェクト自体がではない場合、ではなく、constGetHandle返す必要があります。同様に、が関数の場合、正しく。を取得します。ただし、ではなく、にキャストする必要があります。void *const void *getIntconstGetIntconst void *const Object *Object *

さらに診断するには、initializer is not a constantエラーが発生した正確な行(および関数が呼び出されたコンテキスト)を指定する必要があります。私の推測では、これらの誤ってキャストされた値を使用して、エラーはコードの他の部分に関連していると思います。

于 2012-08-09T11:53:52.197 に答える
1

コードにエラーがあります。constvoid*ハンドルをnon-constObject*に暗黙的にキャストしています。あなたのアプローチは正しいです-Cスタイルのリンクを強制するためにすべてのラッパー関数をextern"C"として定義する必要があります。また、例外を忘れてはなりません-それらがCスタックを通過しないようにラッパーでキャッチする必要があります。

于 2012-08-09T11:54:05.467 に答える