编译C和C++

dan*_*ani 0 c c++ compilation

我有一个用C编写的程序,我需要使用用C++编写的KDIS库.我在KDevelop中使用automake和朋友编译我的C程序.我怎么能一起编译所有东西?因为我想在我的C程序中调用一些KDIS函数.

先感谢您.

MvG*_*MvG 6

如果你需要调用未解密的C++函数extern "C",那么你必须自己从C++程序中完成.您可以在项目中创建一个单独的C++文件,该文件包含您在extern "C"项目其余部分使用的函数中所需的所有库函数.你必须告诉autotools你正在使用C和C++.文件扩展名应该足以决定哪个是哪个.

举个例子,考虑以下mymagic.cclibmagicC++编写的一些创建绑定:

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

对于您的应用程序的其余部分,doMagic()将显示为另一个C函数.但内部是C++,所以它可以使用你想要的任何C++结构.当你需要从库中传递东西时,你应该使用指向不透明类型的指针.因此,在mymagic.h您的C代码也使用的标题中,您可以编写

struct magicValue;
int doMagic(void);
struct magicValue* createMagic(void);
void destroyMagic(struct magicValue*);
Run Code Online (Sandbox Code Playgroud)

然后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;
}
Run Code Online (Sandbox Code Playgroud)

  • @dani:如果KDIS没有提供C接口,那么你需要发明一个.这取决于你如何实现它,但通常你会发现自己在C中定义不透明的指针类型来引用C++中的对象类型,并编写了许多函数`ReturnType Foo_method(Foo*self,other args. ..){return self-> method(其他args ......); }`. (2认同)