Могу ли я отобразить значение перечисления с помощью printf ()? - PullRequest
46 голосов
/ 29 января 2010

Есть ли однострочник, который позволяет выводить текущее значение перечисления?

Ответы [ 6 ]

45 голосов
/ 29 января 2010

Как строка, нет. Целое число,% d.

Если вы не считаете:

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]);

Это не сработает для чего-то вроде перечисления битовых масок. На этом этапе вам нужна хеш-таблица или какая-то другая более сложная структура данных.

23 голосов
/ 29 января 2010
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!
Вывод: Мой enum Значение: 2

6 голосов
/ 29 января 2010

Правильный ответ на этот вопрос уже дан: нет, вы не можете назвать имя перечисления, только его значение.

Тем не менее, просто для удовольствия, это даст вам перечисление и таблицу поиска в одном и даст вам возможность напечатать ее по имени:

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

Отказ от ответственности: не делайте этого.

2 голосов
/ 29 января 2010

Какой-то чувак придумал умную идею препроцессора в этом посте

Простой способ использовать переменные типов enum в виде строки в C?

2 голосов
/ 29 января 2010
enum A { foo, bar } a;
a = foo;
printf( "%d", a );   // see comments below
0 голосов
/ 02 июня 2014

У меня была такая же проблема.

Мне пришлось напечатать цвет узлов, где был цвет: enum col { WHITE, GRAY, BLACK }; и узла: 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]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...