【问题标题】:How are 'enum' values stored in C language?“枚举”值如何存储在 C 语言中?
【发布时间】:2018-08-21 09:06:08
【问题描述】:

我知道 'enum' 数据类型是用户定义的数据类型,而 'enum' 变量是'int'的大小。

  1. 上面的'identifier'是一组常量值,它们有一个常量值的别名,这些值是如何存储在内存中的?我的意思是“value1”如何存储,即“0”,“value2”如何存储,即“20”,“value3”如何存储,即“7000”,“value4”如何存储,即“1234567”。
  2. 我知道“enum_variable”的大小是 32 位,而不是 强制的。但这里令人困惑的是,32 位 [if] 如何共同存储所有“枚举”值?

    enum identifier
    {
      value1 = 0, value2 = 20, value3 = 7000, value4 = 1234567
    } enum_variable;
    
    printf("%d\n",sizeof(enum_variable));
    

【问题讨论】:

  • 打印sizeof使用%zu

标签: c enums


【解决方案1】:

根本不存储枚举“值”,因为它们是编译时命名的常量。

编译器只是简单地将枚举符号的使用与它的值交换。

此外,枚举值的类型是int 类型,因此确切的大小可能不同。但正因为如此,枚举值可以是与int 相同范围内的任何值。

有关更多信息,请参阅例如this enumeration reference.

【讨论】:

  • 为什么会产生 '4bytes' ?在这种情况下,“4bytes”是什么意思?
  • 因为在你的机器上整数类型存储在 4 个字节中
  • 是4字节大小的常量还是4字节大小的变量?
  • @shaiknisarahmed 在现代典型的 32 位或 64 位机器上,int 的大小为 4 个字节。在较小的嵌入式系统上,它可能仍然是两个字节。没有什么能阻止它在未来的系统中达到 8 个或更多。
  • @SouravKannanthaB 在文件范围(外部函数)定义的常量变量将具有外部链接,因此可从其他翻译单元获得,编译器无法删除其定义。但是如果值是已知的(即在定义它的同一个翻译单元中),编译器可以进行编译时常量折叠(用它的值替换它的使用)作为优化。枚举值没有存储空间,它们在编译后不存在,因此更类似于宏。但比宏更安全。
【解决方案2】:
  1. 枚举常量,例如value1,就是简单的数字。它们不存储在枚举变量本身中,而是作为任何其他数字常量存储:作为机器代码本身的一部分(通常称为.text 的段)或单独的只读段(通常称为@987654323 的段) @)。

    枚举常量保证为int 类型,但这仅在使用它们的表达式中很重要。它们在内存中的实际存储方式是实现定义的(取决于系统、编译器和链接器)。

  2. 实际变量可以有任何大小,它是实现定义的。尽管编译器应该选择一个可以适应最大枚举常量的大小。同样,它只是一个简单的整数,它只能容纳一个数字。

一般来说,C 中的枚举只是普通整数之上的“语法糖”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多