关于LwRB环形缓冲区开源库的纯C++版本支持原子操作
2024-01-09 19:12:53
1、LwRB环形缓冲区开源库:
2、相关的使用方法参考其它文章
3、在C++中使用原子操作时编译失败,对其进行分析并做相应的修改。
1)现象:gcc编码成C库成功,用C连接成功,程序成功,但想在C++里使用,用g++编译会失败。
2)分析:原因是原子操作在C11和C++11上函数不一致造成的,而lwrb库的作者作了C++的兼容却没有隐藏C原子操作不一致的特性函数。
3)问题:那如果要在C++中使用怎么处理呢?
4)修改成纯C++函数:
? ? ? a、头文件:
去掉以下内容:
__cplusplus宏判断、extern、LWRB_DISABLE_ATOMIC等C特性的东西
加上:
#include <atomic>
//#include <stdatomic.h>
using namespace std;
? ? b: 源文件,修改成cpp或cxx
去掉以下内容:
LWRB_DISABLE_ATOMIC相关的部分代码
修改宏成为以下内容:
#define BUF_SEND_EVT(b, type, bp) \
do { \
if ((b)->evt_fn != NULL) { \
(b)->evt_fn((lwrb_t*)(b), (type), (bp)); //void*总是报错,直接换成 lwrb_t* \
} \
} while (0)
#define LWRB_INIT(var, val) ((var)=(val))
#define LWRB_LOAD(var, type) ((var).load(type))
#define LWRB_STORE(var, val, type) ((var).store((val), (type)))
对于类型转换总是提示错误,可以:
加上编译选项 -fpermissive
或 用static_cast
或 直接强制类型转换
5)测试修改效果:
a:编译测试,成功通过。
b:如果只是g++,只修改a头文件就可以成功
c:如果是海思等嵌入式g++,如aarch64-himix200-linux-g++则必须修改a头文件和b源文件。
6)如果想兼容C:
a:在代码中隐藏一下C的原子操作函数
b:用C++宏判断__cplusplus、extern处理C++部分
文章来源:https://blog.csdn.net/howesao/article/details/135484925
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!