代码之家  ›  专栏  ›  技术社区  ›  aybe

声明结构或联合成员的正确语法是什么?

  •  -2
  • aybe  · 技术社区  · 2 年前

    长话短说,我用索尼PlayStation生成标题。SYM符号文件。

    当我用Visual Studio代码测试语法的有效性时,我得到了以下内容:

    联合的标记类型与类“PacketData”的声明不兼容

    示例:

    struct PacketData
    {
        short Data[2];
        unsigned long Control;
    };
    
    struct Packet
    {
        unsigned char CheckSum;
        char Action;
        short Padw;
        union PacketData Data; // tag kind of union is incompatible with declaration of class "PacketData"
    };
    

    这个问题似乎可以通过删除 union 之前 PacketData

    这是由输出的结构 DUMPSYM.EXE 命令行实用程序:

    结构体:

    02cc47: $00000000 94 Def class STRTAG type STRUCT size 8 name Packet
    02cc5b: $00000000 94 Def class MOS type UCHAR size 0 name CheckSum
    02cc71: $00000001 94 Def class MOS type CHAR size 0 name Action
    02cc85: $00000002 94 Def class MOS type SHORT size 0 name Padw
    02cc97: $00000004 96 Def2 class MOS type UNION size 4 dims 0 tag PacketData name Data
    02ccb6: $00000008 96 Def2 class EOS type NULL size 8 dims 0 tag Packet name .eos
    

    工会:

    02cbe2: $00000000 94 Def class UNTAG type UNION size 4 name PacketData
    02cbfa: $00000000 96 Def2 class MOU type ARY SHORT size 4 dims 1 2 tag  name Data
    02cc13: $00000000 94 Def class MOU type ULONG size 0 name Control
    02cc28: $00000004 96 Def2 class EOS type NULL size 4 dims 0 tag PacketData name .eos
    

    然而,为什么结构体成员可以 可选地 拥有 struct 前缀

    struct Sprite
    {
        unsigned char X;
        unsigned char Y;
        unsigned short Page;
        unsigned char SWidth;
        unsigned char SHeight;
        unsigned short Clut;
    };
    
    struct SpriteData
    {
        struct Sprite *Sprites;
        struct Sprite *EndSprites;
        unsigned long Data;
    };
    

    你能澄清一下如何宣布这些成员吗?

    2 回复  |  直到 2 年前
        1
  •  2
  •   dbush    2 年前

    你已经定义 struct PacketData ,后来尝试创建类型为的变量/成员 union PacketData 。这是两种不同的类型。

    您收到的特定错误消息表明您正在使用C++编译器进行编译。在C++中,您可以创建 struct union 而不使用相应的关键字。这也意味着在C++中不能创建 结构 和一个 协会 具有相同的名称,这就是错误消息告诉您的。

    考虑到你发布的垃圾信息告诉你 PacketData 协会 ,您应该将其定义为该类型:

    union PacketData
    {
        short Data[2];
        unsigned long Control;
    };
    

    如果您的代码实际上是C,那么您应该使用C编译器进行编译。如果这恰好是MSVC,这意味着您的源文件需要有一个.c扩展名。