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



为什么我们需要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个字节是没有道理的!

一些书中提到了enum的概念,即您可以在enum的变量中只存储enum的元素,而不存储其他值。但大多数编译器允许您将标识符用作普通整数变量,并使用其他值。

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

enum的主要用途是提供变量意图的自文档。当你写:
enum month aMonth;

很明显,CCD_ 2的值应该只来自枚举中声明的一组常量。如果你使用宏,你会声明它:

int aMonth;

没有什么告诉你哪些价值观是合适的或不合适的。

正如你所注意到的,当你为变量赋值时,C并不能阻止你使用枚举类型之外的值,但编译器仍然可以对此发出警告。如果没有类型声明,编译器就无法知道该警告什么。

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

最新更新