我正在用C编写程序,但我想使用像vector这样的动态库。是否可以在C程序中使用C ++库?
答案 0 :(得分:11)
不是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;
}
答案 1 :(得分:2)
此外,How to mix C and C++提供了有关此主题的重要提示。
答案 2 :(得分:1)
是的,只要您使用C ++编译器进行编译即可。请注意,这不再是C程序,而是C ++程序。
答案 3 :(得分:1)
如果您的编译器编译C ++,您可以。我会说在大多数编译器情况下,如果你使用gcc,你尤其可以。
大多数IDE允许您创建一个新的C ++应用程序,然后您可以在纯C中编写代码并在需要时使用C ++对象。
你可以这样做,因为C ++是C的超集。这意味着C ++包含C的所有功能,并在C之上添加更多功能。
答案 4 :(得分:1)
std::vector
是一个模板类。它依赖于C ++提供给存在的特殊语法。
您可以使用围绕opaque pointer到vector
的函数集合来包装其功能,但代价是自己处理vector
类的分配。< / p>
我建议反对它,因为你会引入不必要的复杂性和可疑的好处。只需在需要使用C ++构造时编写C ++,并在函数声明extern "C"
后面进行抽象。