c - 为什么我们在 C 中需要枚举数据类型,尽管它比通过一个变量字符串甚至 #define 实现它使用更多的内存

标签 c types enums

为什么我们在 C 中需要枚举数据类型,尽管它比通过一个变量字符串实现它使用更多的内存。

例如,如果我们将枚举设置为:`

enum month {janueary, february, march, april, may, june, july, august, september, november, december};
enum moth aMonth;
aMonth = "janueary" 
aMonth = "february"

该枚举在内存中分配 12*4 字节。如果我们用一根绳子来容纳这12个 元素它会更高效,因为我们节省了更多内存。在这种情况下代码 将如下:

char *aMonth;
aMonth = "janueary" 
aMonth = "february"
and so on.

如果枚举是例如

enum month{januearyyyy,february};

即字符串字符分配两个以上的整数分配我们可以使用 #define例如:

#define janueary 0

等等。甚至没有分配任何变量。

只为一个常量值保留 4 个字节是毫无意义的!

有些书说枚举的想法是,您可以在枚举变量中仅存储枚举的元素,而不能存储其他值。但大多数编译器允许您将标识符用作普通整型变量并使用其他值。

那么,使用枚举数据类型有什么好处?

最佳答案

枚举的主要目的是提供变量意图的 self 记录。当你写:

enum month aMonth;

很明显,aMonth 的值只能来自枚举中声明的常量集。如果您使用宏,则需要声明它:

int aMonth;

没有任何东西可以告诉您哪些值合适或不合适。

正如您所注意到的,当您分配给变量时,C 不会阻止您使用枚举类型之外的值,但编译器仍然可能会发出警告。如果没有类型声明,编译器就无法知道要警告什么。

声明枚举不会保留任何内存。内存仅分配给变量,而不分配给结构和枚举的声明。并且枚举的大小不会乘以元素的数量 - sizeof(enum Month) 不是 12*4。编译器可以使用任何足够大以容纳所有值的整数类型;对于enum Month,它可以使用unsigned char,因此它只有1个字节(但我认为大多数编译器默认使用int作为枚举,所以它们将是 4 个字节)。

关于c - 为什么我们在 C 中需要枚举数据类型,尽管它比通过一个变量字符串甚至 #define 实现它使用更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37224639/

相关文章:

C 用户输入的数组大小

c# - 这两个枚举 [Flags] 声明之间有什么区别(C#)

matlab - 如何在 MATLAB 中获取变量的类型

swift - 无法访问全局常量文件中定义的枚举案例的原始值

java - 自定义枚举属性给出错误 String types not allowed

c - 如果计算机是 "copying bits",为什么 signed int 会自动转换为 unsigned int?

c - 可移植数学 C 代码在 Linux 64 和 Windows 32 上表现不同

c - 函数可以计算数组 A 中有多少个数字落在从低到高的范围内。

typescript - 使用 typescript 的 enzyme 中 ReactWrapper 的确切类型

c++ - 类型衰减——它是什么以及为什么会存在?