c++ - 编译 C 和 C++

标签 c++ c compilation

我有一个用 C 编写的程序,我需要使用 KDIS用 C++ 编写的库。我在 KDevelop 中使用 automake&friends 编译我的 C 程序。我怎样才能将所有东西编译在一起?因为我想在我的 C 程序中调用一些 KDIS 函数。

提前谢谢你。

最佳答案

如果您需要调用未声明为 extern "C" 的 C++ 函数,则您必须自己从 C++ 程序执行此操作。您可以在项目中创建一个单独的 C++ 文件,将您需要的所有库函数包装在 extern "C" 函数中,以供项目的其余部分使用。您必须告诉 autotools 您正在使用 C 和 C++。文件扩展名应该足以决定哪个是哪个。

举个例子,考虑以下 mymagic.cc 为一些用 C++ 编写的 libmagic 创建绑定(bind):

#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++ 结构。当你需要从你的库中传递东西时,你应该使用指向不透明类型的指针。因此,在您的 C 代码也使用的 header 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;
}

关于c++ - 编译 C 和 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11755549/

相关文章:

c - 订阅值既不是数组也不是指针

C Makefile - 如何在构建时添加头文件(linux 内核)?

c# - C#程序可以以 '{'开头吗?如果没有,为什么不呢?

c - 编译时出错 - 初始化程序中指定的未知字段

c++ - 指向不完整类型数据成员的指针

c - 使用 scanf 获取字符串,然后对该字符串使用 if 语句,而不是 c 语言中的字符

C++ 如何将 "overload"模板用于值和类型?

c - 与信号量的合并实现

c++ - 延迟初始化?

c++ - 有人可以解释这个正则表达式行的含义吗?