gpt4 book ai didi

c - 在所有编译器中使用枚举都是安全的吗?

转载 作者:太空宇宙 更新时间:2023-11-04 00:27:07 24 4
gpt4 key购买 nike

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

他不记得到底是哪个编译器有问题,但在这些问题中,在做类似的事情时有错误

enum my_enum{
my_enum_first = 5;
my_enum_second = 10;
};

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

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

另一个例子是代码完成,您的 IDE 会告诉您可以指定什么作为函数的有效参数。我知道——只要你将代码编译为 C 代码——就没有类型安全(即我也可以指定 5 而不是 my_enum_first ),所以使用 enum似乎是一种更美观的东西。

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


编辑 1:
关于环境:我们正在为各种嵌入式平台开发,所以可能也有一些晦涩的微 Controller 的编译器......


编辑 2:
他可以告诉我KEIL C51 编译器不能很好地处理枚举。是否有使用当前版本的C51 编译器的经验?

最佳答案

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

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

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

例如:

typedef enum {
FirstValue = 12,
SecondValue = 25,

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

关于c - 在所有编译器中使用枚举都是安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632771/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com