我目前正在开发一个C程序,具体取决于具有C接口的第三方库(头文件是用C语言编写的)。我通过链接所有必需的.so文件编译我的程序,一切都很好。但是,我最近看了一下这个第三方库的源代码。显然,它是用C ++编写的,它确实利用了一些C ++特性(名称空间,OOP等)。
这甚至可能吗?所以我可以用C ++编写一个库,提供一个C接口,生成.so文件来隐藏C ++实现,然后我的库可以在一个C程序中使用?它会引起问题吗?
谢谢!
答案 0 :(得分:4)
是。
该库是用C ++编写的,但它提供了一个使用C链接的接口,以便链接到您的c程序
这基本上是可行的,因为C ++标准专门提供了为C ++程序指定链接规范的规定。
例如:
extern "C"
{
void doSomething(char);
}
extern "C"
这里是链接规范,它使C ++中的函数doSomething()
具有'C'链接(编译器不做C ++样式 1 {{3 }} )这可确保您的C代码可以链接到它
由于C ++函数定义已经编译并转换为二进制格式,因此客户端应用程序/库“C”链接器只使用“C”名称链接到此代码。
1 C和C ++名称管理差异的一个例子:
C ++支持函数重载而C不支持,因此C ++编译器需要通过添加有关函数参数参数的信息来破坏名称。 AC编译器不需要使用函数参数来破坏名称,因为没有函数重载支持。当您使用extern“C”链接链接规范时,C ++编译器不会将函数参数信息添加到用于链接的名称。