An enum in C is used to enumerate things . For example , to enumerate the days of the week , such as Monday , Tuesday or Wednesday , or to enumerate error codes , such as OK or WARN , or maybe to enumerate colors , such as red , or blue .
Data which is enumerated is of the int
type. The enum
type , have a type which is compatible with one of : char
, signed or unsigned integer type . The choice of the enum
type is implementation defined , but it must be able to store all the values of the enumerated data .
The enum keyword is used to declare an identifier of the enum type ,
enum color ; enum error_codes;
The enum color
, and enum error_codes
are incomplete types because no enumerated data has been initialized , they cannot be used later on , to declare variable of type enum color
or enum error_codes
.
enum color ; enum color red ; /* Will cause the following compilation error : error: variable has incomplete type 'enum color' enum color red ;*/
So an enum type , such as an enum color
is used to enumerate things , an enum type is declared by using the enum
keyword . An enum type must list its enumerated data using an enumerator list , when being declared , or else it will be an incomplete type . This can be done like this :
enum daysOfWeek { Monday , Tuesday , Wednesday , Thursday , Friday , Saturday , Sunday };
The preceding declaration declares the identifier daysOfWeek
to be of the enum
type , it is initialized with enumerated data of the int
type : Monday , Tuesday , Wednesday , Thursday , Friday , Saturday , and Sunday . Monday will have a value of 0
, Tuesday a value of 1
, and each subsequent data will have a value of the previous one plus one .
#include<stdio.h> enum daysOfWeek { Monday , Tuesday , Wednesday , Thursday , Friday , Saturday , Sunday }; int main ( void ) { printf( "Monday is : %d \n", Monday ); printf( "Tuesday is : %d \n", Tuesday ); printf( "Wednesday is : %d \n", Wednesday ); printf( "Thursday is : %d \n", Thursday ); printf( "Friday is : %d \n", Friday ); printf( "Saturday is : %d \n", Saturday ); printf( "Sunday is : %d \n", Sunday );} /* output : Monday is : 0 Tuesday is : 1 Wednesday is : 2 Thursday is : 3 Friday is : 4 Saturday is : 5 Sunday is : 6 */
The enumerated data , such as Monday , or Tuesday , or Friday … have a scope , which is where these identifiers are visible . Their scope is the scope where they are declared , so if they are declared globally , as in the previous example , they have a source file or a global scope , as such they can be accessed from anywhere in the source file , if declared inside a function , they have a block scope , so they can only be accessed from within the function …
The enumerated data , is also referred to as an enumeration constant , since once it is assigned a value in an enumerator list , its value cannot change .
It is not necessary to provide an identifier for an enum type , only the data can be initialized .
#include<stdio.h> int main ( void ) { enum { Monday , Tuesday , Wednesday , Thursday , Friday , Saturday , Sunday }; printf( "Tuesday is : %d \n" , Tuesday );} /* output : Tuesday is : 1*/
The initialized data , can be initialized to specific values using the =
operator . The next enumerated data , will always have a value of the previous one , plus one . In addition to that , enumerated data , can be initialized to have the same values .
#include<stdio.h> enum code { OK , WARN, ERROR , PASS = 0 , INFORMATIONAL , EXCEPTION }; int main ( void ) { printf( "[OK,%d] , [WARN,%d] , [ERROR,%d]\n" , OK , WARN , ERROR ); printf( "[PASS,%d] , [INFORMATIONAL,%d] , [EXCEPTION,%d]\n" , PASS , INFORMATIONAL , EXCEPTION );} /* output : [OK,0] , [WARN,1] , [ERROR,2] [PASS,0] , [INFORMATIONAL,1] , [EXCEPTION,2] */
A variable of an enum type , can be declared using one of these methods :
enum color{red , green , blue}aFirstColor ; enum color aSecondColor ; enum {OK, WARN }status_code ;
In the first method , the variable aFirstColor
of the enum type color
, is declared while declaring and initializing the enum color
type .
In the second method , the variable aSecondColor
is declared after having declared the enum type . And in the last method , a variable status_code
is declared without assigning an identifier to the enum type .
It is not necessary for a variable of an enum type , to have as a value one of the enumerated values , it can be assigned any value .
#include<stdio.h> enum networkState { up , down }; int main ( void ) { enum networkState state = 2 ; enum networkState *statePtr = &state; switch( *statePtr ) { case up : printf( "network state is up\n" ); break; case down : printf( "network state is down\n" ) ; break ; default : printf( "network state is unknown\n" ); }} /* output : network state is unknown */