comp.lang.ada
 help / color / mirror / Atom feed
From: David Thompson <dave.thompson2@verizon.net>
Subject: Re: Ada Smileys in C++ lib Conversion
Date: Tue, 24 Aug 2010 06:12:04 -0400
Date: 2010-08-24T06:12:04-04:00	[thread overview]
Message-ID: <rl6776dj9evtiapo4fgv10psnju49f01aa@4ax.com> (raw)
In-Reply-To: Xns9DD75B13CC31FWarrensBlatherings@188.40.43.230

On Tue, 17 Aug 2010 12:57:11 +0000 (UTC), Warren <ve3wwg@gmail.com>
wrote:

> Maciej Sobczak expounded in news:be7c80ac-3fce-4779-8542-
> 115567f649de@g17g2000yqe.googlegroups.com:
> 
> > On 16 Sie, 16:54, Warren <ve3...@gmail.com> wrote:
> > 
> >> > const int MC_CTL_LOCAL_C �= 0x80;
> >> > and so on.
> > 
> >> Another approach is to declare them as enums. But this
> >> is unhelpful because they are all implemented as int's.
> > 
> > No. Enums are separate types.
> 
> They are considered different "types" but (in C at least),
> they're implemented as ints. IOW, you can't mix the enums
> but you can supply an enum in an int argument.
> 
Yes but no but yes.

In C all enum _constants_ are exactly type '(signed) int' (and within
that specific type's range) and an enum _type_ is represented as
_some_ supported integer type (like int or short) sufficient to cover
the range of constants declared. Most compilers just use 'int' for all
enum types, since it is always sufficient, but this isn't required; at
least on some targets GCC has -fshort-enums and attribute((packed)). 

An enum value in most expressions has applied the 'default promotions'
which convert it to an integer type (almost always signed int), and a
(reasonable) integer value can be assigned or passed by value to any
enum. But the types are not formally 'compatible' and e.g. pointer to
enum foo is not implicitly convertible to or from pointer to int.

C++ makes some changes. First, enum constants can be 'long' and (thus)
types up to that, although on some machines that's not actually wider
than 'int'. Second, enums convert _to_ integer but not the reverse and
not one enum to another, and constants are of enum type not int (or
long). Thus e.g. void bar(int x) and void bar(enum foo x) are
distinguishable for overloading.

> >> Further, the switch statement doesn't tell you about the
> >> cases which are missing.
> > 
> > Try g++ -Wswitch.
> 
or slightly stricter -Wswitch-enum . and gcc also. (Or more exactly
GCC for both C++ and C, because gcc and g++ are actually drivers that
can compile either -- and other supported languages like Ada too; the
main difference is which language(s) they can *link*, and at link time
compiler-warning settings are no longer applicable.)

> GCC extension. Try it on HP or AIX C compiler.
> 
Indeed.




      parent reply	other threads:[~2010-08-24 10:12 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-13 14:20 Ada Smileys in C++ lib Conversion Warren
2010-08-13 15:06 ` Yannick Duchêne (Hibou57)
2010-08-13 16:53 ` Anh Vo
2010-08-14  1:36   ` Warren
2010-08-14  9:52     ` Georg Bauhaus
2010-08-14 10:57     ` Brian Drummond
2010-08-14 20:34       ` Maciej Sobczak
2010-08-14 21:01         ` Dmitry A. Kazakov
2010-08-15  1:16         ` Brian Drummond
2010-08-15 10:04           ` Maciej Sobczak
2010-08-16 12:08             ` Brian Drummond
2010-08-16 12:13               ` Georg Bauhaus
2010-08-16 12:30             ` Brian Drummond
2010-08-16 12:39               ` Maciej Sobczak
2010-08-16 21:39                 ` Brian Drummond
2010-08-16 22:53                   ` Robert A Duff
2010-08-24 10:12           ` David Thompson
2010-08-30  9:51             ` Brian Drummond
2010-08-16 14:54       ` Warren
2010-08-16 20:27         ` Maciej Sobczak
2010-08-17 12:57           ` Warren
2010-08-17 13:37             ` Maciej Sobczak
2010-08-17 15:07               ` Georg Bauhaus
2010-08-18 17:31               ` Warren
2010-08-24 10:12             ` David Thompson [this message]
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox