0

私はCで書かれたプログラムを持っていて、C++で書かれたKDISライブラリを使用する必要があります。KDevelopのautomake&friendsを使用してCプログラムをコンパイルします。どうすればすべてを一緒にコンパイルできますか?Cプログラム内でいくつかのKDIS関数を呼び出したいからです。

前もって感謝します。

4

2 に答える 2

6

デクラレートされていないC++関数を呼び出す必要がある場合はextern "C"、C++プログラムから自分で呼び出す必要があります。プロジェクト内に単一のC++ファイルを作成して、プロジェクトextern "C"の残りの部分で使用される関数に必要なすべてのライブラリ関数をラップすることができます。CとC++の両方を使用していることをautotoolsに通知する必要があります。ファイル拡張子は、どれがどれであるかを決定するのに十分でなければなりません。

例を挙げると、C++で記述されたmymagic.ccいくつかのバインディングを作成する次のことを検討してください。libmagic

#include <libmagic/magic.hh>
extern "C" {
  int doMagic() {
    magic::Wizard w("foo", 42);
    magic::Result res = w.doMagic();
    return res.getResultCode();
  }
}

アプリケーションの残りの部分には、doMagic()単なる別のC関数として表示されます。ただし、内部はC ++であるため、任意のC++構造を使用できます。ライブラリからのものを渡す必要がある場合は、不透明(OPAQUE)型へのポインタを使用する必要があります。したがって、Cコードでも使用されるヘッダーmymagic.hには、次のように記述できます。

struct magicValue;
int doMagic(void);
struct magicValue* createMagic(void);
void destroyMagic(struct magicValue*);

そして、mymagic.ccあなたはより明確になります:

struct magicValue {
    magic::value v;
    magicValue(magic::value val) : v(val) { }
};
magicValue* createMagic() {
    return new magicValue(magic::value("foo"));
}
void destroyMagic(magicValue*) {
    delete magicValue;
}
于 2012-08-01T08:43:42.040 に答える
2

このリンクは、アプリケーションでCコードとC++コードを混在させる方法を理解するのに役立つ場合があります。

また、このStack Overflowの質問を見てください。それが、あなたが必要としていることだと思います。

于 2012-08-01T08:42:03.050 に答える