views:

222

answers:

6

When I declare a enum variable like this:

enum paint_colors { RED, GREEN, BLUE, ...} colors;

is the colors variable useful? If so, what can I do with it?

Thanks in advance.

A: 

An enum is helpful when you have a given set of possible values, where each value has a meaningful name. Elsewhere, you refer to the enum values, rather than "magic numbers", which can become meaningless among other code.

Grant Palin
That's not what the OP is asking, I think. He wants to know what `colors` is good for.
Carl Norum
Hmm, clearly I misunderstood the question.
Grant Palin
+10  A: 

Really what you're doing there is declaring a variable inline with the rest of the definition of the enumeration. It's equivalent to:

enum paint_colors { RED, GREEN, BLUE };
enum paint_colors colors;

Often, you'll see a typedef associated with the definition:

typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors;

Which lets you use the enumeration more like the built in types:

paint_colors color;

So the answer to your question is that colors is a variable of type enum paint_colors, and can be used any way you think is appropriate for such a variable:

colors = RED;
if (colors != GREEN)
{
    colors = BLUE;
}

And so on.

Carl Norum
it continue useless for me, and for C. I can use int or other types instead paint_color type, the variable colors is still useless.
drigoSkalWalker
@drigoSkalWalker, it lets you do some limited typechecking. If you don't want to use them, you don't have to. It can come in handy though.
Carl Norum
You are asking two questions now. Whether the _variable_ 'colors' is useful, depends on the rest of the program. The _type_ 'enum paint_colors' is useful as it communicates the intent and value range for this variable and others - it puts more emphasis on the What ('this is one of 3 colors'), and less on the How ('this is stored as an int').
Lars
+1  A: 

You could paint a roller coaster!

typedef struct {
  Color car;
  Color door_handle;
  Color wheels;
} RollerCoasterColors;

int main(void) {
  RollerCoasterColors roller_coaster_colors;
  roller_coaster_colors.car = RED;
  roller_coaster_colors.door_handle = YELLOW;
  roller_coaster_colors.wheels = PURPLE;

  // now paint_roller_coaster() knows what colour to paint each part!
  paint_roller_coaster(roller_coaster_colors);
}
yjerem
That doesn't use the `colors` variable at all, which is what the OP was asking about.
Carl Norum
A: 

It's usefull! thanks!!

pepins
A: 

I find enums especially useful during debugging. If you just use #define to define constants used as values for some variable the debugger will show you the numer. With enum it can show you the names.

And if you need a set of possible values (constants) for a single variable you can define it the way you showed.

Jacek Konieczny
+2  A: 

Internally, an enum is treated as an integer that can only hold a limited range of values. In this case, the constants RED, GREEN, BLUE, ... will be defined and will be equal to 0, 1, 2, ... (respectively). The variable colors can be used anywhere an int can be used. You can use operators like ++ to iterate through the list of colors. The only difference between declaring enum paint_colors colors and int colors is that the enumerated variable can should only be assigned one of the enumerated constants.

This gives you several benefits over using #define to create a series of constants and using a normal int for colors. First, some debuggers can detect that colors is an enumerated type and will display the name of the enumerated constant instead of a numeric value.

More importantly, this can add an additional layer of type checking. It is not required by the C standard, but some compilers check and make sure that values assigned to a variable of enumerated type correspond to one of the enumerated constants.

Mentally, you can almost think of this is similar to saying:

#define RED    0
#define GREEN  1
#define BLUE   2
typedef int paint_colors;
paint_colors colors;

The variable is treated like an int, but explicitly giving it a different type helps to clarify what the variable is and what it is used for.

bta