【问题标题】:cast void* to a struct with an array member将 void* 强制转换为具有数组成员的结构
【发布时间】:2013-07-10 02:34:56
【问题描述】:

我正在尝试将数据流直接转换为一个结构,该结构实际​​上具有可变数量的其他结构作为成员。这是一个例子:

    struct player
    {
        double lastTimePlayed;
        double timeJoined;
    };

    struct team
    {
        uint32_t numberOfPlayers;
        player everyone[];
    };

然后我打电话:

    team *myTeam = (cache_team*)get_stream();

这应该像某种序列化一样工作,我知道我的流的结构完全如上所示,但我遇到了 numberOfPlayers 是一个变量的问题。

我的流以 4 个字节开始,代表球队的球员人数,然后它包含每个球员(在这种情况下,每个球员只有 lastTimePlayed 和 timeJoined)。

发布的代码似乎可以正常工作,由于默认的赋值和复制构造函数,我仍然收到编译器的警告,但我的问题是有可能以其他方式执行此操作,更好的方式。

顺便说一句,我的流实际上是到文件的直接映射,我的目标是像使用文件本身一样使用结构(该部分工作正常)。

【问题讨论】:

    标签: c++ arrays casting struct void


    【解决方案1】:

    uint32_t 是 4 个字节。如果它以 8 个字节开头,则需要 uint64_t

    如果您想摆脱警告,您可以将默认副本和分配设为私有:

    struct team {
        // ...
    private:
        team(const team &);
        team &operator=(const team &);
    };
    

    由于您可能希望通过指针传递所有内容,因此它将防止意外复制。

    将映射指针转换为结构可能是最简单的方法。最重要的是确保一切都正确排列。

    【讨论】:

    • 你是对的 uint32_t 是 4bytes :) 刚刚编辑了我的问题。关于问题本身:是的,这样我就摆脱了警告,实际上是一种方法。我确定无论如何我都不会实例化或复制该结构。
    【解决方案2】:

    Visual Studio 2012 提供以下功能:

    warning C4200: nonstandard extension used : zero-sized array in struct/union
    A structure or union contains an array with zero size.
    Level-2 warning when compiling a C++ file and a Level-4 warning when compiling a C file.
    

    这似乎是一条合法的消息。我建议您将结构修改为:

    struct team
    {
            uint32_t numberOfPlayers;
            player everyone[1];
    };
    

    这样的定义不太优雅,但结果基本相同。 C++ 不检查索引的值。大量代码都在使用它。

    新开发应尽可能避免“数组大小违规”。以这种方式描述外部结构是可以接受的。

    【讨论】:

      【解决方案3】:

      scarrirawr 的解决方案和你的解决方案都可以解决问题,但我实际上是在寻找另一种方法。

      我确实找到了。我使用了 uint32_t everyonePtr 而不是数组,然后我将使用 reinterpret_cast 将 uint32_t 转换为指针,如下所示:

      player *entries = reinterpret_cast<player*>(&team->everyonePtr);

      那么我的映射将按预期工作,我认为它比数组[1] 甚至是空的更容易理解。谢谢各位。

      【讨论】:

        猜你喜欢
        • 2019-08-25
        • 2021-09-07
        • 1970-01-01
        • 1970-01-01
        • 2018-06-08
        • 2021-08-05
        • 2016-09-24
        • 2011-02-15
        • 2014-05-10
        相关资源
        最近更新 更多