【发布时间】:2009-11-01 19:25:52
【问题描述】:
我正在用 C 语言编写程序,但我想使用动态库,例如向量。是否可以在 C 程序中使用 C++ 库?
【问题讨论】:
我正在用 C 语言编写程序,但我想使用动态库,例如向量。是否可以在 C 程序中使用 C++ 库?
【问题讨论】:
不是std::vector,不是。任何模板化的东西都是正确的。
一般来说,使用 C++ 代码并不好玩,但可以做到。您必须将类包装在您的 C 代码可以调用的普通非类函数中,因为 C 不做类。为了使这些函数可以在 C 中使用,您可以使用 extern "C" 声明将它们包装起来,告诉 C++ 编译器不要进行名称修改。
然后您可以使用 C++ 编译器编译包装函数并创建一个库,您的 C 程序可以链接到该库。这是一个非常简单的例子:
// cout.cpp - Compile this with a C++ compiler
#include <iostream>
extern "C" {
void print_cout(const char *str) {
std::cout << str << std::endl;
}
}
/* print.c - Compile this with a C compiler */
void print_cout(const char *);
int main(void) {
print_cout("hello world!");
return 0;
}
【讨论】:
此外,How to mix C and C++ 有关于该主题的精彩提示。
【讨论】:
可以,只要您使用 C++ 编译器进行编译即可。请注意,这不再使它成为 C 程序,而是 C++ 程序。
【讨论】:
如果您的编译器编译 C++,您可以。我会说在大多数编译器情况下你可以,特别是如果你使用 gcc。
大多数 IDE 允许您创建一个新的 C++ 应用程序,然后您可以用纯 C 编写代码并在需要时使用 C++ 对象。
您可以这样做,因为 C++ 是 C 的超集。这意味着 C++ 包含 C 的所有特性,并在 C 之上添加了更多功能。
【讨论】:
std::vector 是一个模板类。它依赖于 C++ 为 exist 提供的特殊语法。
您可以使用一组将opaque pointer 传递给vector 的函数来包装它的功能,代价是您自己处理vector 类的分配。
我建议不要这样做,因为你会引入不必要的复杂性和可疑的好处。当您需要使用 C++ 结构时,只需编写 C++,并将其抽象为声明 extern "C" 的函数。
【讨论】: