[comp.lang.c++] typedefs in C++

wm@ogccse.ogc.edu (Wm Leler) (11/28/88)

In section 3.2 of the Wiener & Pinson C++ book, the following example
is given to explain C++ declarations:

	typedef enum {red, green, amber} traffic_light_color;

	typedef struct intersection
	{
		traffic_light_color traffic_light;
		int number_cars_queued;
		int cumulative_number_cars;
	};

Now, I know this example is poor (and to prevent everyone on the net
from posting what's wrong with it, I'll explain below), but the
purpose of this posting is not to attack this book.  What I want to know
is, why does it compile?  I used these declarations with the program

	void main()
	{
		intersection i;
		i.traffic_light = red;
	}

and it compiled!  And I added the word "struct" before the declaration
of "intersection i" and the C compiler took it as well (both Vax and
Sequent C compilers!).  Can anyone give me a clue as to why this works?

Now, the explanation I promised.  In both C++ and C a typedef takes
the form
	typedef <type> <newtypename>;
as in
	typedef unsigned char BYTE;
	BYTE b;
or in
	typedef struct 
	{
		traffic_light_color traffic_light;
		int number_cars_queued;
		int cumulative_number_cars;
	} intersection;
	intersection i;

In C++, struct names (and enum names) are automatically typenames,
so typedefs are not necessary for struct definitions, and the last
example can be simply written as
	struct intersection
	{
		traffic_light_color traffic_light;
		int number_cars_queued;
		int cumulative_number_cars;
	};
	intersection i;
Because of this, the example from the book doesn't need to be a
typedef, and in fact, their example seems to be midway between
C++ and C, but not really either.  So, again, why does it compile?

Wm Leler
wm@cse.ogc.edu