C++匿名联合重新声明错误

Posted

技术标签:

【中文标题】C++匿名联合重新声明错误【英文标题】:C++ anonymous union redeclaration error 【发布时间】:2018-04-24 09:20:20 【问题描述】:

我想创建一个可用于存储 3D 坐标或线性方程的结构。 代码如下:

struct myStruct 
    union 
        // coordinates (3d)
        struct 
            int x,y,z;
        ;
        // linear equation (ax+b)
        struct 
            int a,b,x;
        ;
    ;
;

我收到以下错误:

error: redeclaration of ‘int myStruct::<anonymous union>::<anonymous struct>::x’

我使用的是 linux mint 18.04,g++ (5.4.0),使用 --std=c++11 编译。

我明白这个问题。但有几个问题。

    我在 windows 上看到了一些相关的东西,为什么? 实现它的最佳方法是什么,以便它在两者 (linux/win) 上都能正常工作?

【问题讨论】:

标准 C++ 不允许匿名结构。无论如何,您都依赖于扩展程序。 为什么要他们匿名?顺便说一句,你的工会没有成员 @user463035818 我想移植一个可以在 win 上运行的小型 c++ 库,让它在 linux 上运行,我遇到了这个代码(问题)。 只是给他们起名字;),毕竟他们并不重要。 @user463035818 :D 是的,我试过了,问题就消失了。想知道这是否会使其他事情崩溃,以及将来避免此类情况的最佳做法是什么。 【参考方案1】:

只要给他们名字。这应该没问题:

struct myStruct 
    union 
        struct coordinates  int x,y,z; ;
        struct linear_equation  int a,b,x; ;
        coordinates coord;
        linear_equation lin_eq;
    ;
;

我还允许自己在工会中添加一些成员。但是,这两个结构具有相同类型和数量的成员,所以恕我直言,使用联合的麻烦是值得怀疑的。

【讨论】:

但这是否意味着您失去了执行以下操作的能力:myStruct.x?我有一个在 windows 上依赖于这种风格的代码库,通过每个人的代码并插入 myStruct.coordinates/myStruct.linear_equation 只是为了访问数据成员会很有压力【参考方案2】:

只是为了补充user463035818 的答案。您可以通过直接声明成员来稍微简化您的联合,例如:

struct myStruct 
    union 
        // coordinates (3d)
        struct 
            int x,y,z;
         coord;
        // linear equation (ax+b)
        struct 
            int a,b,x;
         lin_eq;
    ;
;

【讨论】:

谢谢,实际上这是我使用的确切解决方法:P

以上是关于C++匿名联合重新声明错误的主要内容,如果未能解决你的问题,请参考以下文章

GLUT 问题:错误重新声明 C++ 内置类型“wchar_t”

windows.h 的 C++ 问题,在 vs17 中非法声明匿名“结构”

为啥重新声明 std::cout 会导致分段错误?

Xcode 指示 C++ 不存在的已删除变量的未声明标识符错误

循环依赖结构,使用前向声明时重新定义结构错误

SunCC 5.12 到 5.14 和“不能在匿名联合中声明类型”