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++部分