0

我之前的一篇文章提出了匿名结构的话题,有几位评论员说这些在 C++ 中是不允许的。

这是我经常使用的结构:这是合法的 C++ 吗?

const int HeaderSize = 8192;
struct Header
{
    union
    {
        struct
        {
            int r;
            // other members
        };
        unsigned char unused[HeaderSize]; // makes Header struct's size remain constant as members are added to the inner struct
    };
    // Default constructor
    Header()
    {

    }
};
4

2 回答 2

1

匿名结构在 C++ 中不是一个东西,只有匿名联合。所以你必须为结构提供一个名称。

此外,匿名联合也不能有嵌套类型,这意味着您也必须将结构从联合中取出。

因此,结合这两个位,这意味着您需要编写:

const int HeaderSize = 8192;
struct Header
{
    struct Members
    {
        int r;
        // other members
    };

    union
    {
        Members members;
        unsigned char unused[HeaderSize]; // makes Header struct's size remain constant as members are added to the inner struct
    };

    // Default constructor
    Header()
    {

    }
};
于 2020-07-08T05:37:08.233 回答
1

在标准 C++ 中,不能有匿名结构(请参阅此处了解原因),尽管主流编译器将其作为扩展提供。

我猜你打算将二进制数据直接读入这个结构。这在 Modern C++ 中是不受欢迎的,最好使用数据序列化。

如果您坚持直接阅读结构,也许另一种选择是:

struct Header
{
    int r;
    // other members;
};

struct Image
{
    Header hdr;
    char padding[HeaderSize - sizeof(Header)];
    // rest of image
};
于 2020-07-08T05:32:19.443 回答