简体   繁体   English

C++:匿名结构的结构前向声明导致“声明冲突”

[英]C++: struct forward declaration of anonymous struct causes "conflicting declaration"

I have got this hpp file:我有这个 hpp 文件:

struct rte_spinlock_t;

class A {

    public:
        void init();
    private:
        rte_spinlock_t* spinlock;
};

and the corresponding cpp file:以及对应的cpp文件:

#include "A.hpp"

typedef struct {
    int lock;
} rte_spinlock_t;

void A::init()
{

}


Now, compiling like this: g++ A.cpp I get this error:现在,像这样编译:g++ A.cpp 我得到这个错误:

A.cpp:5:3: error: conflicting declaration ‘typedef struct rte_spinlock_t rte_spinlock_t’
    5 | } rte_spinlock_t;
      |   ^~~~~~~~~~~~~~
In file included from A.cpp:1:
A.hpp:2:8: note: previous declaration as ‘struct rte_spinlock_t’
    2 | struct rte_spinlock_t;
      |        ^~~~~~~~~~~~~~

Obviously making the struct named it works, unfortunately I cannot control the typedef of struct rte_spinlock_t that is in a library.显然使命名它的结构有效,不幸的是我无法控制库中 struct rte_spinlock_t 的 typedef。

How could I workaround this?我该如何解决这个问题?

I expect to be able to forward an unnamed struct without getting into conflicting declaration.我希望能够转发一个未命名的结构而不会陷入声明冲突。

From what I understand what you have is more-less this (erroneous code): https://godbolt.org/z/zarsTq6oE据我了解,您所拥有的更多(错误代码): https://godbolt.org/z/zarsTq6oE

Why don't you use pimpl (private implementation) idiom for extra level of indirection and hiding the "gory details"?为什么不使用 pimpl(私有实现)成语来进行额外级别的间接访问并隐藏“血淋淋的细节”?

Let's assume my X is your A , lib.h contains the troublesome typedef:假设我的X是你的Alib.h包含麻烦的 typedef:

//example.cpp
#include "example.hpp"
#include "lib.h"

struct Impl
{
    CStruct* cs;
};

void X::init()
{
    clib_init(&impl->cs);
}

X::X()
{
    impl = std::make_unique<Impl>();
}
X::~X() = default;
//example.hpp
#pragma once
#include <memory>

struct Impl;

struct X
{
    X();
    ~X();

    //rest of special functions omitted for brevity
    //feel free to add them at your own leisure
    void init();
    std::unique_ptr<Impl> impl;

};

Live demo: https://godbolt.org/z/4jYGrYEjr现场演示: https://godbolt.org/z/4jYGrYEjr

BTW, I made an assumption that your troublesome struct is C code based on some searching...顺便说一句,我假设你的麻烦结构是基于一些搜索的 C 代码......

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM