【问题标题】:C++ anonymous structs?C++ 匿名结构?
【发布时间】:2020-10-28 10:59:19
【问题描述】:

我之前的一篇文章提出了匿名结构的话题,有几位评论员说这些在 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()
    {

    }
};

【问题讨论】:

    标签: c++ anonymous-struct


    【解决方案1】:

    在标准 C++ 中不能有匿名结构 (see here for why),尽管主流编译器将其作为扩展提供。

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

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

    struct Header
    {
        int r;
        // other members;
    };
    
    struct Image
    {
        Header hdr;
        char padding[HeaderSize - sizeof(Header)];
        // rest of image
    };
    

    【讨论】:

    • 数据序列化很笨拙,我不知道它会如何处理二进制数据。您提出的解决方案将具有相同的效果,我没有看到优势。
    • @Woody20 我的建议优于你的建议是它是有效的代码
    • 所以你的答案是,我展示的结构不是有效的 C++?但是,它确实适用于我的编译器(VS 2019)。
    • @Woody20 我在回答的第一段中提到了这一点
    【解决方案2】:

    匿名结构在 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()
        {
    
        }
    };
    

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2016-03-30
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2018-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多