G++ enums 'underlying type'

Gabriel Dos Reis gdr@integrable-solutions.net
Wed Dec 29 21:45:00 GMT 2004


Paul Schlie <schlie@comcast.net> writes:

| > From: Gabriel Dos Reis <gdr@integrable-solutions.net>
| > | Paul Schlie <schlie@comcast.net> writes:
| > | > From: Paolo Carlini <pcarlini at suse dot de>
| > | > assuming something specific about g++ 'underlying type' (7.2/5) will alow
| > me
| > | > to remarkably simplifiy the implementation of tr1/type_traits/is_enum: is
| > it
| > | > signed or not? Basing on some simple experiments on x86, seems always wide
| > | > either like an int or a long: is this correct in general?
| > | 
| > | To my understanding, C enums need only be represented as the smallest rank
| > | signed or unsigned integer type capable of representing it's value range
| > | (although GCC tends to first unnecessarily promote enums to int, which I
| > | believe is officially the largest enum equivalent type, and then back them
| > | down opportunistically; keeping their converted form as small as possible is
| > | significant to small machine targets, so they should not be unnecessarily
| > | represented as being any larger than necessary, just as bool/char/short
| > | types should not be needlessly promoted).
| > 
| > In C, enumerator are ints -- even though the associated enumeration
| > type is considered a distinct types.  Only C++ allows for the smallest
| > integer type as the underlying type; and C++ enumerators are not ints.
| 
| Converted to integer type of compatible rank, not "int"

You're confusing an "enumerated type" ("enumeration" in C++ speak)
with "enumerator", i.e. the named constants.

|  6.3  Conversions
|  ...
| 
|  -- The rank of any enumerated type shall equal the rank of
|             the compatible integer type.

Irrelevant.

If you're quoting the C standard, see 6.7.2.2/3

       Semantics

       [#3]  The  identifiers in an enumerator list are declared as
       constants that have type int and may  appear  wherever  such
       are  permitted.107)   An  enumerator  with  =  defines   its
       enumeration   constant   as   the   value  of  the  constant
       expression.  If the first enumerator has no =, the value  of
       its  enumeration  constant is 0.  Each subsequent enumerator
       with no = defines its enumeration constant as the  value  of
       the constant expression obtained by adding 1 to the value of
       the previous enumeration constant.  (The use of  enumerators
       with  =  may  produce enumeration constants with values that
       duplicate  other  values  in  the  same  enumeration.)   The
       enumerators of an enumeration are also known as its members.

Enumerators are ints, in C.

In C++, they are not.  

In both languages, the enumeration (i.e. the type declared with the
keyword "enum") is a distinct type.

-- Gaby



More information about the Gcc mailing list