我能把C++库用在C语言程序中吗?

4

我正在用C语言编写程序,但是我想使用动态库,例如向量。是否可以在C程序中使用C++库?

5个回答

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;
}

2
然后,我想你需要将C++库链接到应用程序中。例如,通过使用g++进行最终链接而不是gcc。我认为这很明显。 - elcuco
John的回答很好。但是将C++和C代码链接在一起可能会很困难。 我建议在这里使用动态库(.so或.dll)。 - toto

2

1

是的,只要您使用C++编译器进行编译即可。请注意,这将不再使它成为C程序,而是C++程序。


1

如果你的编译器支持C++,那么你就可以这样做。我认为大多数编译器都可以,特别是如果你使用的是gcc。

大多数IDE都允许你创建一个新的C++应用程序,然后在其中使用纯C代码并在需要时使用C++对象。

你可以这样做是因为C++是C的超集,也就是说C++包含了C的所有功能,并在此基础上添加了更多的功能。


1

std::vector是一个模板类。它依赖于C++提供的特殊语法存在。

你可以使用一组函数来包装其功能,这些函数传递一个不透明指针到一个vector,但需要自己处理vector类的分配。

我建议不要这样做,因为你会引入不必要的复杂性,而收益却值得怀疑。当你需要使用C++构造时,只需编写C++代码,并在声明为extern "C"的函数后面进行抽象化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接