【发布时间】:2022-01-04 03:20:12
【问题描述】:
出于好奇:有没有办法在 C 项目中使用 C++ 文件?对于文件,我的意思是能够从头文件和库中访问函数,并在您自己的项目中使用它们来解决已经解决的问题。
【问题讨论】:
出于好奇:有没有办法在 C 项目中使用 C++ 文件?对于文件,我的意思是能够从头文件和库中访问函数,并在您自己的项目中使用它们来解决已经解决的问题。
【问题讨论】:
是的,如果您小心的话,可以混合使用 C 和 C++。具体情况取决于您使用的编译器等。
在 C++ 常见问题解答中有一整章介绍它:http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html。
【讨论】:
如果你将函数、变量和结构外部化
extern "C" {
int global;
}
在头文件中和
extern "C" int global = 20;
在您的 C++ 代码中,它可以在 C 代码中使用。同样的规则也适用于函数。
您甚至可以使用适当的原型调用方法。例如:
class C
{
public:
c(int);
int get();
};
.cpp 中的 C-Wrapper 可能如下所示:
extern "C" void * createC(int i)
{
return (void *) new C(i);
}
extern "C" int Cget(void *o)
{
return ((C *)o)->get();
}
【讨论】:
是否可以选择相反的方向? C++ 代码可以包含 C 头文件并直接链接到 C 库(并且 C 代码通常可以编译为 C++,只需很少或没有更改),但是从 C 中使用 C++ 需要更加小心。
您不能在 C 文件中包含 C++ 标头并期望将其编译为 C。
因此,您需要做的是从您的 C++ 代码中公开一个与 C 兼容的接口(一个标头,其中所有内容都包含在 extern "C" 中,并且不使用 C++ 特定的功能)。如果你有这样的头文件,你可以简单地从你的 C 代码中包含它,并链接到 C++ 库。
【讨论】:
可能最简单的做法是使用 C++ 编译器编译 C 文件。绝大多数代码都将兼容,您将可以免费使用 C++ 标头。
【讨论】:
如果您为 C++ 库提供 C API,则可以使用它。只需在单独的标头中定义 C API(您不能在 C 文件中将标头与 C++ 代码一起使用)。 ICU 项目就是这样做的,它在内部使用 C++,但同时提供 C 和 C++ API。
【讨论】:
【讨论】: