联盟没有名为'B'的成员

问题描述 投票:0回答:2

我有一个

union
,里面有一个
struct
。尝试在 Linux 上编译时,我收到一个错误(或更多类似 50 个错误)。相同的代码适用于 Windows 上的 Visual Studio。

main.c:772:43: 错误:‘联合数据’没有名为‘B’的成员
fwrite(&u.B, sizeof(char), sizeof(u.B), out);
^

我在头文件“typedefs.h”中声明我所有的结构:

union data {
    short buf;
    struct D {
        char A;
        char B;
    };
};

可能是什么问题和可能的解决方法?

c struct compiler-errors union
2个回答
1
投票

匿名结构允许作为标准 C 中其他结构或联合的嵌套成员但它们不能有标签。来自C11标准草案

6.7.2.1 结构和联合说明符


13 一个未命名的成员,其类型说明符是 没有标签的结构说明符称为匿名结构;一个 未命名成员,其类型说明符是没有标记的联合说明符 称为匿名联合。匿名结构的成员或 union 被认为是包含结构的成员或 联盟。如果包含结构或联合,则递归适用 也是匿名的

然而,在您的代码中,虽然嵌套结构没有名称,但它确实有一个标签(

D
);所以,在形式上,它不能用作匿名结构,必须给它一个名字。来自上述标准的同一部分:

2 不声明匿名的结构声明 结构或匿名联合应包含结构声明符列表。

但是,MSVC (Visual Studio) 编译器接受具有标记的未命名(“匿名”)结构作为扩展。

因此,要按原样在

write
调用中使用代码,并使其符合标准,您需要从内部结构中删除
D
标签:

union data {
    short buf;
    struct {
        char A;
        char B;
    };
};

请注意,clang-cl 编译器(可以在 Visual Studio 中使用的 clang 版本)会针对您的代码版本发出警告(尽管不是特别有用,除非您可以解析最后的

[-Wmicrosoft-anon-tag]
部分):

警告:匿名结构是微软的扩展 [-Wmicrosoft-anon-tag]


0
投票

你在联合中声明了一个结构类型,但不是结构的实例。如果从结构中删除标签名称,您将在联合内定义一个匿名结构的实例。这也将使结构成员看起来像工会成员。

union data {
    short buf;
    struct {
        char A;
        char B;
    };
};
© www.soinside.com 2019 - 2024. All rights reserved.