Significación de enumeración en C/C99/C++/C++x / GNU C / GNU C99


Es enum tipo firmado o sin firmar? ¿La significación de enums difiere en C/C99/ANSI C/C++/ C++x / GNU C / GNU C99?

Gracias

Author: James McNellis, 2010-04-05

2 answers

Se garantiza que una enumeración esté representada por un entero, pero el tipo real (y su significación) depende de la implementación.

Puede forzar que una enumeración sea representada por un tipo con signo dando a uno de los enumeradores un valor negativo:

enum SignedEnum { a = -1 };

En C++0x, el tipo subyacente de una enumeración se puede especificar explícitamente:

enum ShortEnum : short { a };

(C++0x también añade soporte para enumeraciones de ámbito)

Para completar, agregaré que en La Programación en C Language, 2nd ed., se especifica que los enumeradores tienen el tipo int (p. 215). K & R no es el estándar C, por lo que no es normativo para los compiladores ISO C, pero es anterior al estándar ISO C, por lo que es al menos interesante desde un punto de vista histórico.

 25
Author: James McNellis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-05 16:01:58

Esta es una vieja pregunta... pero acabo de descubrir esto:

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

Puede usarlo como un índice sin signo de 2 bits, por ejemplo:

typedef struct {
  ENUMNAME i:2;
} STRUCTNAME;

Lo probé en GCC ARM - no funciona.
Además, WinDbg muestra STRUCTNAME.i como número, no como v0-v3.

 0
Author: aleksazr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-15 14:25:18