Three things are being declared here: an anonymous enumerated type is declared, ShapeType is being declared a typedef for that anonymous enumeration, and the three names kCircle , kRectangle , and kOblateSpheroid are being declared as integral constants. Let's break that down. In the simplest case, an enumeration can be declared as enum tagname { ... }; This declares an enumeration with the tag tagname . In C and Objective-C (but not C++), any references to this must be preceded with the enum keyword. For example: enum tagname x; // declare x of type 'enum tagname' tagname x; // ERROR in C/Objective-C, OK in C++ In order to avoid having to use the enum keyword everywhere, a typedef can be created: enum tagname { ... }; typedef enum tagname tagname; // declare 'tagname' as a typedef for 'enum tagname' This can be simplified into one ...