c++ - 是否可以使用 C11 atomics 包含 C 标头而无需在 C++ 中进行修改?
问题描述
我正在尝试在 C++ 应用程序中编写使用此 C 库 而不进行修改。它使用 C11 原子。
考虑以下程序,我们可以将其放入一个名为main.cc
.
#include "mpscq.h"
int main(){}
如果我用 编译它g++ -std=c++11 -c main.cc
,我会得到一整套如下所示的错误。
usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdatomic.h:68:9: error: ‘_Atomic’ does not name a type
typedef _Atomic __UINT_FAST32_TYPE__ atomic_uint_fast32_t;
^
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/stdatomic.h:69:9: error: ‘_Atomic’ does not name a type
typedef _Atomic __INT_FAST64_TYPE__ atomic_int_fast64_t;
是否可以在不修改库代码的情况下修复这些错误?
也就是说,我愿意在我的 c++ 代码或我的编译器标志中使用任何需要的魔法咒语,但我宁愿不更改库代码。
我已经看到了这个答案,但它需要修改头文件。
解决方案
在 C++ 代码中使用该 mpscq 不需要包装器,但需要不同的标头来包含它。那会奏效:
#ifndef MPSCQ_H_FOR_CPP
#define MPSCQ_H_FOR_CPP
extern "C"
{
struct mpscq;
mpscq *mpscq_create(mpscq *n, size_t capacity);
bool mpscq_enqueue(mpscq *q, void *obj);
void *mpscq_dequeue(mpscq *q);
size_t mpscq_count(mpscq *q);
size_t mpscq_capacity(mpscq *q);
void mpscq_destroy(mpscq *q);
}
#endif
也就是说,无论如何我都会编写一个包装器来处理 RAII 等。
推荐阅读
- libgdx - Libgdx 使用 adcolony 和 charboost 优化视频 admob 中介
- python - 试图在 fabfile 中生成扩展名。我究竟做错了什么?
- python - 在命令行中使用通配符作为 sys.argv[2]
- kotlin - 水平布局中的 Vaadin Grid 没有填满屏幕并且 flex grow 不起作用
- c++ - 在 C++ 中计算输入文本的新行
- java - java.io.NotSerializableException:为参数合格货币定义的设置器采用接口类型的参数
- javascript - 为什么我不能使用 AJAX 发布 JavaScript 变量
- hadoop - 在读取使用 sqoop 导入的数据时,在列字段中转义新行字符
- excel - Excel数据之间的空格怎么去掉?
- c#-4.0 - 如何从平面文本文件生成制表符分隔的文本文件