Вы можете использовать препроцессор, чтобы сделать это, я считаю, эта техника называется X-Macros:
/* fruits.def */
X(APPLE)
X(MANGO)
X(ORANGE)
/* file.c */
enum fruits {
#define X(a) a,
#include "fruits.def"
#undef X
};
const char *fruit_name[] = {
#define X(a) #a,
#include "fruits.def"
#undef X
};
Обратите внимание, что последняя запись включает в себя Запятая, которая допускается в C99 (но не в C89). Если это проблема, вы можете добавить ценные значения. Кроме того, можно сделать макрос более сложным, давая несколько аргументов для пользовательских имен и значений перечислений и т.д.:
X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */
Ограничения: Вы не можете иметь отрицательные константы и ваш массив sizeof (char *) * largest_constant
.
Но вы могли бы работать вокруг и с помощью дополнительной таблицы подстановки:
int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};
Это не работает, конечно. Что работа порождает дополнительный набор enum
констант в качестве ключей для имен:
enum fruits {
#define X(a,b,c) a ## _KEY,
#include "fruits.def"
#undef X
#define X(a,b,c) a = c,
#include "fruits.def"
#undef X
};
Теперь вы можете найти имя X(PINEAPPLE, Pineapple, -40)
с помощью fruit_name[PINEAPPLE_KEY]
.
Люди отметили, что им не понравился дополнительный файл include. Вам не нужен этот дополнительный файл, вы также используете #define
. Это может быть более подходящим для небольших списков:
#define FRUIT_LIST X(APPLE) X(ORANGE)
И заменить #include "fruits.def
с FRUIT_LIST
в предыдущих примерах.
Возможные дублируют http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text –
Это все FAQ по межтрубкам и, скорее всего, обман, хотя я не проверял. Ответ: нет, это не может быть сделано (без jumoing через обручи, такие как @Naveen предлагает и рискует выйти из синхронизации. Если вы готовы принять такой риск, то, по-видимому, использование этого решения будет использовать nunber. Это лучше, чем ничего , но это заманчивая судьба ...). – Mawg
@Eugen Constantin Dinca Этот вопрос - только C++, в то время как OP здесь, похоже, хочет решение C. – schot