【发布时间】:2016-08-15 08:50:37
【问题描述】:
已编辑
我目前正在开发一个多平台枚举解析器,并在尝试回答上述问题时发现了这种奇怪的行为。
问题 A)
C标准是否在枚举声明完成之前确定枚举常量的类型?
以 Keil ARMCC 为例:
enum e {
VAL0 = (signed char)126,
VAL1,
VAL2,
SIZE0 = sizeof(VAL0),
SIZE1 = sizeof(VAL1),
SIZE2 = sizeof(VAL2)
};
我得到 SIZE0 = 1,SIZE1 = 1,SIZE2 = 8。 (如果我评估定义之外的枚举常量的大小,所有的大小都是 int)。
它们不应该都等于 sizeof(int) 吗? (请记住,在这种情况下,int 的大小为 4 个字节。)
问题 B)
对于 Keil C251,我有以下内容:
signed int VALUE0 = (signed char)-1;
enum{ VALUE1 = (signed char)-1 };
enum{ VALUE2 = -1 };
printf( "Is VALUE0 equal to VALUE1? ---> %s", VALUE0 == VALUE1 ? "Yes!" : "No!" );
printf( "Is VALUE0 equal to VALUE2? ---> %s", VALUE0 == VALUE2 ? "Yes!" : "No!" );
哪个打印:
Is VALUE0 equal to VALUE1? ---> No!
Is VALUE0 equal to VALUE2? ---> Yes!
不应该都打印yes吗?
我缺少的 VALUE0 和 VALUE1 的定义是否有区别,也许是类型转换?或者这可能是一个编译器错误?
【问题讨论】:
-
这是
enums 在 C 中对嵌入式系统不是很有用的主要原因:port70.net/~nsz/c/c11/n1570.html#6.4.4.3p2 请注意,C 不仅有规范,还有标准(ISO9899,当前版本是 2011 ,又名 C11)。常见的建议是使用类似常量的宏。请注意,const限定变量仍然不是 常量,但是 - 嗯 - C 中的变量。因此您的变量非常无用。 -
这就是我的意思。我从规范变为标准。
-
请注意,
enum的大小是实现定义的,因此受 PCS/ABI 的约束。对于 ARM,请参阅 AAPCS。 -
可以,但不是枚举常量的大小。
-
在枚举数列表之外,sizeof(VAL0) = sizeof(VAL1) = sizeof(VAL2) = sizeof(int)。我的问题是关于枚举器列表中的大小和类型,在枚举声明完成之前。