我目前正在开发一个C程序,依赖于具有C接口的第三方库(头文件是用C编写的)。我通过链接所有必需的 .so 文件来编译我的程序,一切都很好。不过,我最近看了一下这个第三方库的源代码。显然,它是用 C++ 编写的,并且确实利用了一些 C++ 功能(命名空间、OOP 等)。
这可能吗?那么我可以用C++编写一个库,提供一个C接口,生成.so文件来隐藏C++实现,然后我的库可以在C程序中使用?会引起问题吗?
谢谢!
是的。
该库是用 C++ 编写的,但它提供了一个使用 C 链接的接口,以便链接到您的 C 程序。
这本质上是可能的,因为 C++ 标准专门提供了指定链接规范的规定这本质上是可能的,因为 C++ 标准专门提供了为 C++ 程序
例如:
extern "C"
{
void doSomething(char);
}
Run Code Online (Sandbox Code Playgroud)
extern "C"这是链接规范,它使 C++ 中的函数doSomething()具有“C”链接(编译器不执行 C++ 样式1 名称修改),这确保您的 C 代码可以链接到它。
由于 C++ 函数定义已编译并转换为二进制格式,因此客户端应用程序/库“C”链接器仅使用“C”名称链接到此代码。
1 C 和 C++ 名称重整差异的示例:
C++ 支持函数重载,而 C 不支持,因此 C++ 编译器需要通过添加有关函数参数参数的信息来重整名称。由于没有函数重载支持,AC 编译器不需要使用函数参数来破坏名称。当您使用 extern "C" 链接链接规范时,C++ 编译器不会将函数参数信息添加到用于链接的名称中。