sizeof(枚举) == sizeof(int),总是吗?
通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端进行一些处理,那么您更喜欢什么enum/#定义/ const int。
编辑-只是在网络上检查,因为编译器不会象征性地链接宏,那么人们如何调试,将整数值与头文件进行比较?
从Answers -I中添加下面这一行,因为我需要澄清-
枚举“所以它是由实现定义的,
(枚举)可能是等于sizeof(char),即1。”
发布于 2009-07-11 14:49:54
它依赖于编译器,并且在枚举之间可能会有所不同。以下是语义
enum X { A, B };
// A has type int
assert(sizeof(A) == sizeof(int));
// some integer type. Maybe even int. This is
// implementation defined.
assert(sizeof(enum X) == sizeof(some_integer_type));
请注意,C99中的“某些整数类型”也可能包括扩展的整数类型(但是,如果实现提供了扩展的整数类型,则必须对其进行文档记录)。枚举的类型是某种可以存储任何枚举数的值的类型(在本例中为A
和B
)。
我不认为使用枚举有任何惩罚。枚举器也是整型常量表达式(例如,您可以使用它来初始化静态或文件范围变量),并且我尽可能地更喜欢它们而不是宏。
枚举器不需要任何运行时内存。只有在创建枚举类型的变量时,才可以使用运行时内存。只需将枚举器视为编译时常量即可。
我只需要使用一个可以存储枚举器值的类型(我应该事先知道值的大致范围),转换为它,然后通过网络发送它。最好是固定宽度的类型,比如int32_t
,这样当涉及到不同的机器时,就不会出现冲突。或者我会打印号码,然后在另一面扫描,这样就解决了其中的一些问题。
对编辑的响应
编译器不需要使用任何大小。一件容易看到的事情是,值的符号很重要-无符号类型在某些计算中可以有显着的性能提升。以下是我的盒子上的GCC 4.4.0
的行为
int main(void) {
enum X { A = 0 };
enum X a; // X compatible with "unsigned int"
unsigned int *p = &a;
}
但是如果你分配一个-1
,那么GCC会选择使用int
作为X
兼容的类型
int main(void) {
enum X { A = -1 };
enum X a; // X compatible with "int"
int *p = &a;
}
使用GCC的选项--short-enums
,这使得它使用仍然适合所有值的最小类型。
int main() {
enum X { A = 0 };
enum X a; // X compatible with "unsigned char"
unsigned char *p = &a;
}
在最新版本的GCC中,编译器标志已更改为-fshort-enums
。在某些目标上,默认类型为unsigned int
。您可以检查答案here。
发布于 2009-07-11 14:49:16
C99,6.7.2.2p4说
每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,108),但是应当能够表示枚举的所有成员的值。..。
脚注108增加了
实现可以延迟选择哪种整数类型,直到看到所有枚举常量为止。
所以它是由实现定义的,sizeof(枚举)可能等于sizeof(char),即1。
在选择某个小范围的整数时,总是要付出代价的。如果您在内存中将其设置为较小,则可能会产生处理损失;如果您将其设置为较大,则可能会导致空间损失。这是一个时间-空间-权衡。
错误代码通常是#定义的,因为它们需要可扩展:不同的库可能会添加新的错误代码。您不能使用枚举做到这一点。
发布于 2009-07-11 14:56:15
是大小Is (枚举) == sizeof(整型),总是
ANSI C标准规定:
每个枚举类型应与char、有符号整数类型或无符号整数类型兼容。类型的选择由实现定义。(6.7.2.2枚举说明符)
所以我会认为这意味着不。
如果是这种情况,#DEFINE会更好,因为它会节省内存。
与使用枚举相比,使用定义节省内存的方式是什么?枚举只是一种允许您向编译器提供更多信息的类型。在实际得到的可执行文件中,它只是被转换为一个整数,就像预处理器将使用#define创建的宏转换为它的值一样。
通常的做法是什么?如果我必须通过网络传输这些返回类型,并且必须在另一端进行一些处理
如果您计划通过网络传输值并在另一端处理它们,则应该定义一个协议。决定每种类型的字节大小(以位为单位)、字节顺序(字节顺序),并确保在客户端和服务器代码中遵守这一点。另外,不要因为它碰巧工作,就认为你做对了。例如,您选择的客户端和服务器平台上的字节顺序可能是匹配的,但情况可能并不总是如此。
https://stackoverflow.com/questions/1113855
复制相似问题