Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在所有编译器中使用枚举安全吗?_C_Compiler Construction - Fatal编程技术网

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;

也许你应该问你的同事他是哪一年出了这个问题……或者是因为某个不知名的微控制器。:-)他可以告诉我那是“几年前”……也许你应该问你的同事他是哪一年出了这个问题……或者是因为某个不知名的微控制器。:-)他可以告诉我那是“几年前”...