【问题标题】:Can I use an enum as a struct name?我可以使用枚举作为结构名称吗?
【发布时间】:2013-12-17 12:25:06
【问题描述】:

我觉得可以叫字面意思?

enum packet_structures{
   PacketOne,
   PacketTwo,
   PacketThree
};

struct PacketOne{
 unsigned int packet_id;
};
struct PacketTwo{
 unsigned int packet_id;
};

struct PacketThree{
 unsigned int packet_id;
};

假设我有一个通用数据包。

struct PacketGeneral{
 packet_structures TypeOfPacket;
};

PacketGeneral newPacket;

newPacket.TypeOfPacket = PacketOne;

我可以直接使用该枚举的名称将 char* 类型转换为结构(即 PacketOne)吗?无需使用 (struct PacketOne) 进行类型转换,我如何仅使用枚举 newPacket.TypeOfPacket 对相同的结构进行类型转换?

【问题讨论】:

  • 我认为你需要写struct PacketGeneral newPacket。我不会推荐这个。
  • 它的最终目标是什么?您想在“C”中进行继承吗?如果是这样,为什么“C++”标签在这里?
  • 不,你不能。 C 没有反射,我怀疑你是否真的需要这些。
  • 只是试图找到一种方法来根据我 msg_peek 到一般(父)数据包的枚举类型来对数据包进行类型转换。所以我可以在没有 msg_peek 的情况下读取并读取正确的 sizeof 结构,然后将该 char* 缓冲区类型转换为结构 PacketOne。这是可行的,但非常难看,就像手动对每个结构进行类型转换一样。这就是为什么我希望使用 Enum 作为结构的标识符

标签: c++ c enums


【解决方案1】:

不,你不能。枚举用于存储文字而不是标识符。

【讨论】:

  • 还有什么可以用作标识符的吗?就像在不输入“struct PacketOne myPacket”的情况下制作一个 struct PacketOne 一样
【解决方案2】:

不,至少在C 中没有。

enum 声明/定义常量标识符。

因此,您不能再次使用相同的标识符作为结构标记名称。

您可以通过编译包含这些声明/定义的程序来检查。

【讨论】:

  • 标签与其他标识符位于单独的名称空间中,因此enum 的标识符可以用作结构标签名称。 (当然,它们之间不会有关联。)您可以通过编译包含这些声明的程序或阅读 C 2011 标准(草案 N1570)的第 6.2.3 条第 1 段来检查这一点。
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
相关资源
最近更新 更多