enum 类型签名还是未签名? C/C99/ANSI C/C ++/C ++ X/GNU C/GNU C99的符号是否有所不同?

谢谢

有帮助吗?

解决方案

保证枚举由整数代表,但是实际类型(及其签名)依赖于实现。

您可以通过给出枚举者之一的负值来强制枚举以签名类型来表示:

enum SignedEnum { a = -1 };

在C ++ 0x中,可以明确指定枚举的基本类型:

enum ShortEnum : short { a };

(C ++ 0x还增加了对示波器枚举的支持)

为了完整,我将其添加 C编程语言,第二版。, ,指定枚举者具有类型 int (第215页)。 K&R不是C标准,因此对于ISO C编译器而言,这不是规范性的,但是它确实早于ISO C标准,因此从历史的角度来看,它至少很有趣。

其他提示

这是一个古老的问题...但是我刚刚发现了这一点:

typedef unsigned ENUMNAME;  // this makes it unsigned in MSVC C 2015
typedef enum {v0, v1, v2, v3} ENUMNAME;

您可以将其用作2位未签名索引,例如:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

在GCC手臂中尝试了它 - 不起作用。
另外,windbg显示structname.i作为一个 数字, ,不是V0-V3。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top