我曾经让人向我解释过这一点,但我对细节不太清楚:所以当您有一个枚举时,比如在C中,其中的枚举没有起始值,如下所示:

enum Level {  
LOW,   
MEDIUM,   
HIGH 
}; 

编译器只是将任意整数值赋给这些人.即使您要显式指定整数:

enum Level {  
LOW = 0,
MEDIUM = 1,   
HIGH = 2 
}; 

现在您只是在做编译器本来可能做的事情,但是显式地做了.

但是,对于更复杂的枚举,比如Java或Rust中的枚举,情况又如何呢?例如,摘自《铁 rust 》一书的枚举部分:

enum IpAddr {
        V4(u8, u8, u8, u8),
        V6(String),
    }

当很久以前向我解释它时,我隐约记得有人提到这是通过使用2个 struct 来处理的,类似于:

struct enums {

    0,  //arbitrary value used for V4

    1   //arbitrary value used for V6

}
struct values {

     u8 array[4],

     char * string

}

其中第一个 struct 的任意值以某种方式映射到它们可以存储的值上.我还记得,向我解释它的人称这种枚举为某个术语,其中包含"记录"一词.我在这个网站或其他地方找不到任何关于这项技术的提及,所以如果有人能解释一下,或者至少告诉我应该研究什么主题,我将不胜感激.

推荐答案

在C中,最接近的类似功能应该是这样的:

typedef enum {
  TAG_V4,
  TAG_V6,
} ip_addr_tag;

typedef struct {
  a: unsigned char;
  b: unsigned char;
  c: unsigned char;
  d: unsigned char;
} ip_addr_v4;

typedef struct {
  char* string
} ip_addr_v6;

typedef union {
  ip_addr_v4 v4;
  ip_addr_v6 v6;
} ip_addr_content;

// if `tag == TAG_V4`, you may use `content.v4`
// if `tag == TAG_V6`, you may use `content.v6`
typedef struct {  // implement a tagged union
  ip_addr_tag tag;
  ip_addr_content content;
} ip_addr;

有几个不同之处:

  • Rust对标签很聪明,例如,如果它发现一个在union中未使用的字节,它将使用该字节来存储标签,而不是需要多一个字节来存储它;
  • Rust的类型系统保证您正确使用标记/并集;
  • 铁 rust 确保析构函数在您离开作用域时运行.

我希望这能帮到你!

C++相关问答推荐

函数指针始终为零,但在解除引用和调用时有效

POSIX文件描述符位置

标准的C17标准是用括号将参数包装在函数声明中吗

我在这里正确地解释了C操作顺序吗?

将宏值传递给ARM链接器,该链接器将变量放置在特定位置

GDB输出ARM助记符

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

在句子中转换单词的问题

#定义SSL_CONNECTION_NO_CONST

通过k&;r语法的c声明无效

为什么电路板被循环删除?

无法识别C编程语言的语法,如书中所示

如何组合两个宏来初始化C语言中的字符串数组?

`%%的sscanf无法按预期工作

I';我试着从.txt文件中读取文本,并用c计算其中的单词数量

将char*铸造为空**

中位数和众数不正确

添加/删除链表中的第一个元素

将数组返回到链表

C simd _m128 晶圆厂