This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Compiling GCC with g++: a report
mark@codesourcery.com (Mark Mitchell) wrote on 23.05.05 in <4292C8C9.9040400@codesourcery.com>:
> Zack Weinberg wrote:
> > Mark Mitchell <mark@codesourcery.com> writes:
> >
> > [snip stuff addressed elsewhere]
> >
> >>I agree with the goal of more hiding.
> >>
> >>You can do this in C by using an incomplete structure type in most
> >>places, and then, in the files where you want the definition visible,
> >>defining the structure to have a single field of the enumerated
> >>type. That is a little messy, but it is C++-compatible. (In fact, in
> >>ISO C++, without the additions presently in the WP, you can't do
> >>better; forward declarations of enums are still not allowed.)
> >
> >
> > Doesn't work, at least not as a drop-in replacement; you can't pass an
> > incomplete structure by value. We do do this in places where there's
> > a real structure that can be passed around by pointer...
>
> Good point; yes, you would have to pass a pointer. I guess you could
> create a singleton representative of each value in the enum, and pass
> them around, but I agree that's getting pretty ugly. Of course, the
> problem with "unsigned int" is that it is a complete type, and people
> can accidentally pass in "7", even if there's no such enumeral. You
> really want forward-declared enums, but you haven't got them; it may be
> you just lose. :-(
What I've done, in a similar situation, was to declare a complete
structure encapsulating the value - this at least makes sure you need to
acknowledge the structure whenever you access the value. Plus, I've added
inline functions for accessing the value, so those places don't need to
know the structure details either.
This makes it fairly type safe, and you can grep for all kinds of uses
(including people who naughtily access the structure contents directly).
MfG Kai