They can be declared as:
#include<stdio.h> enum Color { RED , GREEN , BLUE , }; int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output: RED = 0 GREEN = 1 BLUE = 2 */The constant RED will be initialized by default with 0, GREEN will be initialized with RED+1 (1) and BLUE will be initialized with (GREEN+1).
Using macrodefinitions, the program above would've looked like this:
#include<stdio.h> #define RED 0 #define GREEN 1 #define BLUE 2 int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output: RED = 0 GREEN = 1 BLUE = 2 */Alternatively, if you initialize the enumeration in this way:
#include<stdio.h> enum Color { RED = 5, GREEN, BLUE, }; int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output: RED = 5 GREEN = 6 BLUE = 7 */The constant RED will be initialized with 5, GREEN will be initialized with RED+1 (6) and BLUE will be initialized with GREEN+1 (7).
TIP: You can can also initialize all members of the enumeration with non-default values:
#include<stdio.h> enum Color { RED = 5, GREEN = 7, BLUE = 3, }; int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output: RED = 5 GREEN = 7 BLUE = 3 */TIP: If you don't initialize the first member of the enumeration, he will be equal to 0 by default even if you initialize other members:
#include<stdio.h> enum Color { RED , GREEN , BLUE =7, }; int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output: RED = 0 GREEN = 1 BLUE = 7 */If you want to declare a Color variable you will have to put the keyword enum in front of it:
#include<stdio.h> enum Color { RED , GREEN , BLUE =7, }; int main(void) { enum Color myColor = RED; switch(myColor) { case RED: puts("My color is red"); break; case GREEN: puts("My color is green"); break; case BLUE: puts("My color is blue"); break; } return 0; } /*Output: My color is red */Alternatively, if you want a shorter declaration you could use typedef:
#include<stdio.h> enum Color { RED , GREEN , BLUE =7, }; typedef enum Color eColor; int main(void) { eColor myColor = RED; switch(myColor) { case RED: puts("My color is red"); break; case GREEN: puts("My color is green"); break; case BLUE: puts("My color is blue"); break; } return 0; } /*Output: My color is red */TIP: A shorter version of the declaration above is:
#include<stdio.h> typedef enum { RED , GREEN , BLUE =7, }eColor; int main(void) { eColor myColor = RED; switch(myColor) { case RED: puts("My color is red"); break; case GREEN: puts("My color is green"); break; case BLUE: puts("My color is blue"); break; } return 0; } /*Output: My color is red */TIP: Also, multiple members of an enumeration can have the same constant value:
#include<stdio.h> typedef enum { RED = 0, GREEN = 1, BLUE =1, }eColor; int main(void) { puts("This WILL NOT trigger an error"); printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output This WILL NOT trigger an error RED = 0 GREEN = 1 BLUE = 1 */TIP: A debugger may be able to print values of enumeration variables in their symbolic form.
PITFALL: A common error that you may encounter while working with enumeration is the enumerator redeclaration as in the example below.
#include<stdio.h> typedef enum { RED = 0, GREEN = 1, BLUE =1, }CarColor; typedef enum { RED, //RED is redeclarated YELLOW, MAGENDA }WallColor; int main(void) { puts("This WILL NOT trigger an error"); printf("RED = %d\nGREEN = %d\nBLUE = %d",RED,GREEN,BLUE); return 0; } /*Output ../main.c:20:5: error: redeclaration of enumerator ‘RED’ */TIP : The easiest way to solve such an issue is to adopt the following notation for enumerators: EnumName_EnumeratorDescription.
#include<stdio.h> typedef enum { CARCOLOR_RED = 0, CARCOLOR_GREEN = 1, CARCOLOR_BLUE = 1, }CarColor; typedef enum { WALLCOLOR_RED, WALLCOLOR_YELLOW, WALLCOLOR_MAGENTA }WallColor; int main(void) { printf("RED = %d\nGREEN = %d\nBLUE = %d", CARCOLOR_RED,CARCOLOR_GREEN,CARCOLOR_BLUE); return 0; } /*Output RED = 0 GREEN = 1 BLUE = 1 */In conclusion, enumerations provide a convenient way to associate constant values with names as a more elegant alternative to multiple #define.
Question: What other pitfalls regarding enums do you know?
References:
http://tigcc.ticalc.org/doc/keywords.html#enum
http://en.wikipedia.org/wiki/Enumerated_type#C_and_syntactically_similar_languages
http://cplus.about.com/od/introductiontoprogramming/p/enumeration.htm
http://msdn.microsoft.com/en-us/library/whbyts4t.aspx
No comments:
Post a Comment
Got a question regarding something in the article? Leave me a comment and I will get back at you as soon as I can!