Is there a one-liner that lets me output the current value of an enum?
7 Answers
As a string, no. As an integer, %d.
Unless you count:
static char* enumStrings[] = { /* filler 0's to get to the first value, */
"enum0", "enum1",
/* filler for hole in the middle: ,0 */
"enum2", "enum3", .... };
...
printf("The value is %s\n", enumStrings[thevalue]);
This won't work for something like an enum of bit masks. At that point, you need a hash table or some other more elaborate data structure.

- 2,825
- 6
- 27
- 44

- 97,814
- 39
- 186
- 310
-
15This (of course) implies that your enum really starts at 0 and is consecutive without "holes". – unwind Jan 29 '10 at 12:24
enum MyEnum
{ A_ENUM_VALUE=0,
B_ENUM_VALUE,
C_ENUM_VALUE
};
int main()
{
printf("My enum Value : %d\n", (int)C_ENUM_VALUE);
return 0;
}
You have just to cast enum to int !
Output : My enum Value : 2

- 2,743
- 19
- 21
-
4@aib, it's easy to overlook when to cast and when not, though. What do you mean by "enums"? I would always do the cast. In the above the cast is redundant, because it's using the enumerator. But if he had done `enum MyEnum c = C_ENUM_VALUE;` and then passing `c`, he would need the cast. See discussion below on @Neil's answer. – Johannes Schaub - litb Jan 29 '10 at 13:15
-
@Johannes, from my knowledge, you are right. thanks for the clear explanation ! – Matthieu Jan 29 '10 at 16:15
The correct answer to this has already been given: no, you can't give the name of an enum, only it's value.
Nevertheless, just for fun, this will give you an enum and a lookup-table all in one and give you a means of printing it by name:
main.c:
#include "Enum.h"
CreateEnum(
EnumerationName,
ENUMValue1,
ENUMValue2,
ENUMValue3);
int main(void)
{
int i;
EnumerationName EnumInstance = ENUMValue1;
/* Prints "ENUMValue1" */
PrintEnumValue(EnumerationName, EnumInstance);
/* Prints:
* ENUMValue1
* ENUMValue2
* ENUMValue3
*/
for (i=0;i<3;i++)
{
PrintEnumValue(EnumerationName, i);
}
return 0;
}
Enum.h:
#include <stdio.h>
#include <string.h>
#ifdef NDEBUG
#define CreateEnum(name,...) \
typedef enum \
{ \
__VA_ARGS__ \
} name;
#define PrintEnumValue(name,value)
#else
#define CreateEnum(name,...) \
typedef enum \
{ \
__VA_ARGS__ \
} name; \
const char Lookup##name[] = \
#__VA_ARGS__;
#define PrintEnumValue(name, value) print_enum_value(Lookup##name, value)
void print_enum_value(const char *lookup, int value);
#endif
Enum.c
#include "Enum.h"
#ifndef NDEBUG
void print_enum_value(const char *lookup, int value)
{
char *lookup_copy;
int lookup_length;
char *pch;
lookup_length = strlen(lookup);
lookup_copy = malloc((1+lookup_length)*sizeof(char));
strcpy(lookup_copy, lookup);
pch = strtok(lookup_copy," ,");
while (pch != NULL)
{
if (value == 0)
{
printf("%s\n",pch);
break;
}
else
{
pch = strtok(NULL, " ,.-");
value--;
}
}
free(lookup_copy);
}
#endif
Disclaimer: don't do this.

- 70,428
- 10
- 106
- 108
enum A { foo, bar } a;
a = foo;
printf( "%d", a ); // see comments below
-
3Is that cast to int really needed? In C enums are always of type int. – Maurits Rijk Jan 29 '10 at 12:21
-
-
1@Maurits, @Neil, That cast is needed. Enumeration variables are of a distinct type, and are compatible with *some* integral type being able to store all the values of the enumerators. That's not necessarily type `int`. (An enumeration variable may be compatible with `long`, for instance, just fine). printf's `%d` however wants *exactly* type `int`, so a cast is best to do, i think. Only the enumerators (the one in the list in the declaration) are exactly of type `int`. – Johannes Schaub - litb Jan 29 '10 at 12:29
-
-
Well, these "default argument promotions" happen for "expressions with integer types whose conversion rank is less than or equal the rank of int and unsigned int". Anyway, the conversion rank of enumerations are defined at 6.3.1.1/1 as being "equal to the rank of the compatible integer type". If that compatible type is `long` or something, then no default promotion happens. – Johannes Schaub - litb Jan 29 '10 at 12:52
-
@Johannes OK - I'll leave the code as it stands, as your comments are informative, as usual. – Jan 29 '10 at 12:55
-
Notice that an enumeration is also an integer type (as opposed to C++, where they are not), but the compatible type chosen above must not be an enumeration type, because it says that it must be a "signed integer type or an unsigned integer type" neither of which enumerations are. So i should have said above that "some signed/unsigned integral type or char" is chosen, i think :) This matter is like `bool` or `char` in C++, that are integer types, but neither a "signed integer" one nor an "unsigned integer" (even tho `char` is either signed or unsigned). Matter is a bit complicated, i think -.- – Johannes Schaub - litb Jan 29 '10 at 12:58
-
Now I start to get confused. From this discussion (and Wikipedia, MSDN, etc.) I get the impression that the enum expression is always of type int. The underlying type can differ and can be char, int, long, etc. So printf("%d", a) is potentially dangerous while printf("%d", C_ENUM_VALUE) would be safe? – Maurits Rijk Jan 29 '10 at 13:21
-
3@Maurits, yes. `C_ENUM_VALUE` is called "enumerator", and in C it has always type `int`. But `a` is an enumeration variable, and it has the type of the enumeration. But in C, types can be compatible (which means you can `T *t = &some_u` if `U` and `T` are compatible, among other things). Many rules are stated only in terms of compatibility instead of type equality. An enumeration type is compatible with either `char` or an signed or unsigned integral type. You don't know, and it's best not to make any assumptions on it. – Johannes Schaub - litb Jan 29 '10 at 13:44
Some dude has come up with a smart preprocessor idea in this post
Printing an enum value can be tricky as the sizes of each of its members can vary depending on the implementation. Take this example compiled on gcc 8.4.0.
#include <stdio.h>
int main(void) {
enum option {A = 0, B = 0x100000000};
enum option x = B;
// Enumerator sizes of the same enumeration can differ
printf("sizeof(A)=%zu\n", sizeof(A)); // sizeof(A)=4
printf("sizeof(B)=%zu\n", sizeof(B)); // sizeof(B)=8
printf("sizeof(x)=%zu\n", sizeof(x)); // sizeof(x)=8
// Same output even though they have different values
printf("A=%d\n", (int)A); // A=0
printf("B=%d\n", (int)B); // B=0
printf("x=%d\n", (int)x); // x=0
// You should know beforehand the maximum enumerator size
printf("A=%ld\n", (long)A); // A=0
printf("B=%ld\n", (long)B); // B=4294967296
printf("x=%ld\n", (long)x); // x=4294967296
}

- 2,293
- 1
- 13
- 29

- 819
- 9
- 10
I had the same problem.
I had to print the color of the nodes where the color was: enum col { WHITE, GRAY, BLACK };
and the node: typedef struct Node { col color; };
I tried to print node->color
with printf("%s\n", node->color);
but all I got on the screen was (null)\n
.
The answer bmargulies gave almost solved the problem.
So my final solution is:
static char *enumStrings[] = {"WHITE", "GRAY", "BLACK"};
printf("%s\n", enumStrings[node->color]);

- 326
- 1
- 9
-
I believe this should actually be amended to : `printf("%s\n", enumStrings[node->color]);` As you're now accessing the array itself to find the corresponding string. – davidawad Nov 06 '18 at 19:47