众所周知,实现一个复杂的功能,使用 C++ 的开发周期要比使用 C 语言更短,性价比更高,注意前提是不考虑性能。所以,在一个由 C 语言开发的程序中扩展复杂功能时,可以考虑用 C++ 实现,再封装出 C 语言接口,由原程序调用即可。这不我在实际开发工作中就遇到了这种情况,于是特意总结了一些常见问题。
编译时报错,详细内容如下:
error: unknown type name ‘bool’; did you mean ‘_Bool’
出现这个报错的原因是编译器遇到了不识别的类型名:‘bool’,因为 C 语言标准(C89)中没有定义布尔类型,所以会报错。但是在 C99 标准中增加了 bool 类型的定义,true 代表 1,false 代表 0,所以只要导入 stdbool.h 头文件就行了,引用方式如下:
// 引用头文件
#include <stdbool.h>
我们都知道 C 语言中是没有智能指针概念的,因此在封装 C 适配层时需要将智能指针换行成 void* 类型指针,下面以 shared_ptr(string)共享智能指针为例进行介绍:
std::shared_ptr<std::string>& a_string;
// std::shared_ptr 转 void*
void* myData = (void*)a_string.get();
// void* 转 std::shared_ptr
std::shared_ptr<string> myString((std::string*)myData);
进一步抽象一个模板出来:
std::shared_ptr<T> smart;
// std::shared_ptr 转 void*
void *myData = smart.get();
// void* 转 std::shared_ptr
std::shared_ptr<T> myST((T*)myData);
我们在导出 C++ 动态库时需要在封装层中声明 extern "C" 语句,它的作用是实现 C 和 C++ 的混合编程。在 C++ 源文件中的语句前面加上 extern "C" 语句,就是告诉编译器需要按照类 C 的编译方式和链接方式来编译和链接,这样在 C 语言的代码中就可以调用 C++ 的方法和变量了。
同时,为了动态控制编译选项,一般会配合预编译条件宏 #ifdef__cplusplus 使用,代码框架如下:
#ifdef __cplusplus
extern "C" {
#endif
// C 语言代码部分
#ifdef __cplusplus
}
#endif
本文介绍了一些C语言封装C++动态库时的常见问题。如果大家喜欢,我再继续整理,今天就先到这里,欢迎小伙伴评论留言讨论。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。