是sizeof(枚举)== sizeof(int),总是?
是sizeof(枚举)== sizeof(int),总是?
通常的做法是什么? 如果我必须通过网络传输这些返回类型,并且必须在另一端执行某些处理,那么您希望枚举/#定义/常量整数。
编辑 - 只需在网上检查,因为编译器不象征性地链接宏,那么人们如何调试,然后将整数值与头文件进行比较?
从答案 - 我在下面添加这一行,因为我需要澄清 -
“所以它是实现定义的,并且sizeof(枚举) 可能等于sizeof(char),即1。”
它依赖于编译器,可能在枚举之间有所不同。 以下是语义
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;
}
C99,6.7.2.2p4说
每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的,但是应该能够表示枚举的所有成员的值。 [...]
脚注108增加了
一个实现可能会延迟选择哪个整数类型,直到看到所有枚举常量。
所以它是实现定义的,sizeof(枚举)可能等于sizeof(char),即1。
在选择一些小范围的整数时,总会有一个惩罚。 如果你在内存中使它很小,可能会有处理惩罚; 如果你把它做得更大,会有空间的损失。 这是一个时间与空间的折衷。
错误代码通常是#defines,因为它们需要是可扩展的:不同的库可能会添加新的错误代码。 你不能用enums来做到这一点。
sizeof(enum)== sizeof(int),总是
ANSI C标准说:
每个枚举类型应与char,有符号整数类型或无符号整数类型兼容。 类型的选择是实现定义的。 (6.7.2.2枚举规范)
所以我会认为不是。
如果是这种情况,#DEFINE会更好,因为它可以节省内存。
以什么方式使用enum来定义保存内存? 枚举只是一种允许您向编译器提供更多信息的类型。 在实际生成的可执行文件中,只是将其转换为整数,就像预处理器将使用#define创建的宏转换为其值。
通常的做法是什么? 如果我必须通过网络传输这些返回类型,并且必须在另一端执行一些处理
如果您计划通过网络传输值并在另一端处理它们,您应该定义一个协议。 确定每种类型的字节大小,字节顺序(字节顺序),并确保在客户端和服务器代码中都遵守这个规则。 另外,不要只是假设因为它碰巧可以工作,你已经做对了。 例如,在您选择的客户端和服务器平台上,这可能是匹配,但情况并非总是如此。
链接地址: http://www.djcxy.com/p/73583.html上一篇: Is the sizeof(enum) == sizeof(int), always?
下一篇: What is the LD