Есть ли один слой, который позволяет мне выводить текущее значение перечисления?
Можно ли отобразить значение перечисления с помощью printf()?
Ответ 1
Как строка, нет. В качестве целого числа% d.
Если вы не считаете:
static char* enumStrings[] = { /* filler 0 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]);
Это не будет работать для чего-то вроде перечисления бит-масок. В этот момент вам понадобится хеш-таблица или другая более сложная структура данных.
Ответ 2
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;
}
Вы должны просто ввести enum в int!
Выход: Мое значение перечисления: 2
Ответ 3
Правильный ответ на этот вопрос уже дан: no, вы не можете указать имя перечисления, только его значение.
Тем не менее, просто для удовольствия, это даст вам перечисление и таблицу поиска в одном и даст вам возможность распечатать его по имени:
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
Отказ от ответственности: не делайте этого.
Ответ 4
Некоторые чуваки придумали идею интеллектуального препроцессора в этом сообщении
Простой способ использовать переменные типов перечисления как строку в C?
Ответ 5
enum A { foo, bar } a;
a = foo;
printf( "%d", a ); // see comments below
Ответ 6
У меня была та же проблема.
Мне пришлось распечатать цвет узлов, где был цвет: enum col { WHITE, GRAY, BLACK };
и node: typedef struct Node { col color; };
Я попытался напечатать node->color
с помощью printf("%s\n", node->color);
, но все, что я получил на экране, было (null)\n
.
Ответ bmargulies дал почти проблему.
Итак, мое окончательное решение:
static char *enumStrings[] = {"WHITE", "GRAY", "BLACK"};
printf("%s\n", enumStrings(node->color));