首页 > 解决方案 > 是否可以使用 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++catomicc11

解决方案


在 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 等。


推荐阅读