C/C99/C++/C++ x/GNU C/GNU C99中枚举的签名

osg*_*sgx 31 c c++ enums signed

enum类型是签名还是未签名?枚举的签名是否在C/C99/ANSI C/C++/C++ x/GNU C/GNU C99中有所不同?

谢谢

Jam*_*lis 27

枚举保证由整数表示,但实际类型(及其签名)与实现有关.

您可以通过为其中一个枚举数赋予负值来强制枚举由有符号类型表示:

enum SignedEnum { a = -1 };
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,可以显式指定枚举的基础类型:

enum ShortEnum : short { a };
Run Code Online (Sandbox Code Playgroud)

(C++ 0x还增加了对范围枚举的支持)

为了完整起见,我将在The C Programming Language,2nd ed中添加它.,枚举数被指定为具有类型int(第215页).K&R不是C标准,所以这不是ISO C编译器的规范,但它确实早于ISO C标准,所以从历史的角度来看它至少是有趣的.

  • @osgx GCC在编译时决定适用于`enum`的签名.我有一个枚举器,其值从零向上并在函数内检查该枚举器的值永远不会小于零(它用作数组索引).GCC给了我一个警告`avServerApi.c:23:警告:无符号表达式的比较<0总是假的.如果我在`enum`中放置一个虚拟的`-1`,那么随着枚举器被签名,警告就会消失. (10认同)
  • gcc 实际使用什么符号? (2认同)
  • C标准还指定每个*枚举常量*具有类型`int`.但是,术语"枚举常量"是指在`enum {}`块中声明的值常量.具有`enum`类型的变量在C中可以具有任何整数类型,例如,如果可以表示所有值,则它可以是比"int"更短的类型.(例如,GCC有一个选项`-fshort-enums`来完成这个.) (2认同)