代码之家  ›  专栏  ›  技术社区  ›  merlin2011

是否可以在C++中使用C 11原子头而不修改?

  •  5
  • merlin2011  · 技术社区  · 6 年前

    我试图用 this C library 未经修改 在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++代码或编译器标志中使用任何需要的魔法咒语,但我不想更改库代码。

    我见过 this answer 但它需要修改头文件。

    2 回复  |  直到 6 年前
        1
  •  4
  •   John Bollinger    6 年前

    是否可以在不修改库代码的情况下修复这些错误?

    _Atomic 类型限定符,但库头中声明的结构具有成员,包括第一个 _原子的 -合格类型。C++将不接受这个(并将头包包括在 extern "C"

    C允许对象 _原子的 _原子的 相同类型的版本,因此在一般意义上,这意味着C++不能直接访问该结构的任何实例的任何成员。

    _原子的 和非- _原子的 类型,那么您可能会使C++编译器接受该头文件。 #define _原子的 到一个空字符串,但这将是一个网关更微妙的错误。你不能指望C++提供库所期望的原子访问语义,所以即使在这种情况下,C++也不能安全地访问结构的成员(直接)。

    如果它足以操作 struct 只有通过提供的函数,才能通过不透明指针来执行此操作。创建头的版本,该版本提供结构的前向声明,但不提供定义,并提供所有函数声明(带有C链接)。您的C++代码应该接受头并能够调用函数,既接收和返回指针,也不必试图去引用结构的实例。

    #ifndef __MPSCQ_H
    #define __MPSCQ_H
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    struct mpscq;
    
    struct mpscq *mpscq_create(struct mpscq *n, size_t capacity);
    // other functions ...
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

        2
  •  5
  •   Öö Tiib    6 年前

    您不需要在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