C 在所有编译器中使用枚举安全吗?
在一次讨论中,一位同事告诉我,他从未使用过C 在所有编译器中使用枚举安全吗?,c,compiler-construction,C,Compiler Construction,在一次讨论中,一位同事告诉我,他从未使用过enum,因为他经历过一些C编译器无法正确处理enum语句 他记不清哪个编译器确实有问题,但在这些问题中,在执行类似操作时会出现错误 enum my_enum{ my_enum_first = 5; my_enum_second = 10; }; i、 e.初始化枚举值,而不是让编译器自动赋值。另一个问题是编译器自行决定枚举的大小,因此在各种平台下编译代码时,my_enum的大小可能会有不可预测的行为 为了解决这个问题,他告诉我更好地使用#d
enum
,因为他经历过一些C编译器无法正确处理enum
语句
他记不清哪个编译器确实有问题,但在这些问题中,在执行类似操作时会出现错误
enum my_enum{
my_enum_first = 5;
my_enum_second = 10;
};
i、 e.初始化枚举值,而不是让编译器自动赋值。另一个问题是编译器自行决定枚举的大小,因此在各种平台下编译代码时,my_enum的大小可能会有不可预测的行为
为了解决这个问题,他告诉我更好地使用#define
s来定义常量元素。但特别是对于使用doxygen,拥有一个enum(例如,作为函数参数)非常方便,因为在生成的文档中,您只需单击my_enum
,直接跳转到my_enum
的描述
另一个例子是代码完成,IDE告诉您可以为函数指定哪些有效参数。我知道,只要您将代码编译为C代码,就没有类型安全性(即,我也可以指定5
,而不是my_enum\u first
),因此使用enum
似乎更具装饰性
问题是:您知道有哪些编译器在使用enum
方面有限制吗
编辑1:
关于环境:我们正在为各种嵌入式平台开发,因此也可能有一个编译器用于一些不知名的微控制器
编辑2:
他可以告诉我KEIL C51编译器不能很好地处理Enum。使用当前版本的C51编译器是否有任何经验?我非常确定,使用enum不好的编译器是无效的编译器-标准中指定了enum,因此未能实现它意味着编译器在技术上不应用于编译C(对于记录,枚举类型的范围在6.2.1中讨论,并在6.2.5(C99的)中定义为一种类型,因此可以假设它是标准的有效部分)!
因此,不,我不知道有任何这样的编译器。我非常确定,一个不能很好地使用enum的编译器是一个无效的编译器-enum是在标准中指定的,因此未能实现它意味着编译器在技术上不应该用于编译C(对于记录,枚举类型的范围在6.2.1中讨论,并在6.2.5(C99的)中定义为一种类型,因此可以假设它是标准的有效部分)!
因此,不,我不知道有任何这样的编译器。编译器可以根据枚举的可能值范围自由选择枚举的大小。只有当您在API中公开枚举,并且代码的用户可能使用不同的编译器或构建选项时,这才真正成为一个问题 在这种情况下,例如,调用代码传入一个16位的值,而接收代码希望它是32位,这可能会导致混淆。如果传入值的前16位未初始化,则会发生不好的事情 您可以通过在枚举中包含一个虚拟条目来强制执行最小大小,从而解决此类问题 例如:
typedef enum {
FirstValue = 12,
SecondValue = 25,
DummyValue = 65536 // force enum to be greater than 16 bits
} MyEnum;
编译器可以根据枚举的可能值范围自由选择枚举的大小。只有当您在API中公开枚举,并且代码的用户可能使用不同的编译器或生成选项时,这才真正成为一个问题 在这种情况下,例如,调用代码传入一个16位的值,而接收代码希望它是32位,这可能会导致混淆。如果传入值的前16位未初始化,则会发生不好的事情 您可以通过在枚举中包含一个虚拟条目来强制执行最小大小,从而解决此类问题 例如:
typedef enum {
FirstValue = 12,
SecondValue = 25,
DummyValue = 65536 // force enum to be greater than 16 bits
} MyEnum;
也许你应该问你的同事他是哪一年出了这个问题……或者是因为某个不知名的微控制器。:-)他可以告诉我那是“几年前”……也许你应该问你的同事他是哪一年出了这个问题……或者是因为某个不知名的微控制器。:-)他可以告诉我那是“几年前”...