在所有编译器中使用枚举是否安全?

时间:2011-04-12 09:04:24

标签: c compiler-construction

在一次讨论中,一位同事告诉我他从不使用enum,因为他经历过某些 C编译器无法正确处理enum语句。 / p>

他不记得哪个编译器确实存在问题,但在问题中,在执行类似

之类的操作时会出现错误
enum my_enum{
  my_enum_first  = 5;
  my_enum_second = 10;
};

即。初始化枚举值而不是让编译器执行自动赋值。另一个是编译器自己决定枚举的大小,因此在各种平台下编译代码时,sizeof my_enum可能会有不可预测的行为。

为了解决这个问题,他告诉我最好使用#define来定义常量元素。但是特别是对于使用doxygen而言,使用枚举(例如作为函数参数)非常方便,因为在生成的文档中,您只需单击my_enum并直接跳转到my_enum的描述。

另一个例子是代码完成,您的IDE会告诉您可以指定哪些函数的有效参数。我知道 - 只要您将代码编译为C代码 - 没有类型安全(即我也可以指定5而不是my_enum_first),所以使用{ {1}}似乎更具有美感。

问题是:您知道有哪些编译器对enum的使用有限制吗?


编辑1:
关于环境:我们正在为各种嵌入式平台开发,因此也可以编译一些模糊的微控制器 ...


编辑2:
他可以告诉我, KEIL C51 编译器与枚举效果不佳。当前版本的 C51 编译器是否有任何经验?

2 个答案:

答案 0 :(得分:5)

编译器可以根据其可能值的范围自由选择枚举的大小。如果您在API中公开枚举,并且您的代码的用户可能正在使用不同的编译器或构建选项,那么这只会成为一个问题。

在这种情况下,例如,调用代码传递16位值,并且接收代码期望它为32位,可能导致混淆。如果传入值的前16位未初始化,则会发生不好的事情。

您可以通过在枚举中包含虚拟条目来强制执行最小尺寸来解决此类问题。

例如:

typedef enum {
    FirstValue = 12,
    SecondValue = 25,

    DummyValue = 65536  // force enum to be greater than 16 bits
} MyEnum;

答案 1 :(得分:4)

我很确定编译器与枚举不兼容是一个无效的编译器 - 枚举在标准中指定,因此无法实现它意味着编译器在技术上不应该用于编译C(对于记录,枚举类型的范围在6.2.1中讨论并在6.2.5(C99)中定义为类型,因此可以假设它是标准的有效部分,在其中)!
所以不,我不知道任何这样的编译器。