0

私は現在、非常に低レベルのCプログラムと高レベルのC++プログラムの間のインターフェースを作成しています。それらが関連する方法は、リンクリストを介したものです。Cプログラムにはリンクリストがあり、インターフェイスはリンクリストの各ノードに格納されている情報を取得し、それをC++ベクトルに変換します。プロセス自体はプログラムではありません。問題は、CプログラムからそのC++関数を呼び出す方法です。それについて少し説明させてください。

int importData(List *head, char * source, char * dest);

と呼ばれるC++ファイルで宣言されていますimport_helper.cpp。私は宣言を定義し、上に示した後、実装を定義したので、コンパイルは文句を言いません。でimport.c、Cプログラムで、その関数を呼び出そうとしています。覚えておいてください。Listは、import.c Nowで定義された構造体import.cです。

#if defined(_cplusplus)
extern 'C' {
#endif
typedef struct list{
   struct list *next
   .. other additional data goes here ...
}List;

int importData(List *head, char *source, char *dest);
#if defined(_cplusplus)
}
#endif

そしてimport_helper.cppヘッダーで私はし#include "import.c"ます。import.c.hファイルがありません(誰かがそのコードを書いた、私は個人的にそれ自体が間違いだと思います)。

コンパイルすると、次のようになります。

error: expected unqualified-id before 'class'
error: conflicts with the new declaration with 'C' linking
error: previous declaration of 'void getPassword(char *)' with 'C++' linkage 

これは単なるサンプルです。ただし、でコンパイルされ、ファイルimport.cはでコンパイルされるとgcc思います。それが理由でしょうか?私は同様のアプローチで他のファイルを持っていたので、それについてはよくわかりません。何か考えはありますか?ありがとうBuildimport_help.cppg++

4

4 に答える 4

1

import_helper.h解決策は、ファイルを作成することでした。次に、 との両方に ( ) を含めimport_helper.cppました。私は持っています:#include "import_helper.h"import_helper.cppimport.cimport_helper.h

extern "C"{
   typedef struct list{
      ... /*some code goes here */
      struct list* next;
   }List;
   int importData(List *, char*, char*);
}

したがって、.c.cppは同じデータを共有します。

于 2012-06-15T15:42:11.527 に答える
0

C++は例外をスローする可能性があります。

C ++コードへの「C」インターフェースがすべてをキャッチし、エラーステータスを返し、メッセージのようなcstringのようなものを返すことを確認してください。そうすれば、予期しないプログラム終了が発生しなくなります。

于 2012-06-15T15:45:20.053 に答える
0

.cpp ファイルで importData を定義するときは、extern "C" (二重引用符に注意) ブロックにも配置する必要があります。

extern "C"{
    int importData(List *head, char *source, char *dest){
        blah blah blah
        ...
    }
}

そして、エラーからvoid getPassword(char *)もそれが必要です。

于 2012-06-15T14:25:23.000 に答える
0

バックエンドで C++ を使用する DLL を作成することにより、2 つのプロジェクト間で共通のコードを共有できます。宣言が C 用に作成されている限り、定義済みのメソッドを C または C++ プログラムから呼び出すことができるはずです。

于 2012-06-15T14:05:55.977 に答える