你可以使用預處理要做到這一點,我相信這種技術被稱爲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
};
現在,您可以通過使用fruit_name[PINEAPPLE_KEY]
找到X(PINEAPPLE, Pineapple, -40)
名稱。
人們指出他們不喜歡額外的包含文件。你不需要這個額外的文件,你也可以使用#define
。這對於小型列表更合適:
#define FRUIT_LIST X(APPLE) X(ORANGE)
並與前面的例子FRUIT_LIST
更換#include "fruits.def
。
可能重複http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text – 2010-08-11 07:04:57
這是一個常見問題解答所有在這裏,儘管我沒有檢查,但很可能是在這裏。答案:不,這是不可能的(沒有像@Naveen所暗示的那樣瘋狂跳躍,並冒着失去同步的風險,如果你準備冒這樣的風險,那麼多人似乎都會用這個解決方案。 ,但它很誘人......)。 – Mawg 2010-08-11 07:10:02
@Eugen Constantin Dinca這個問題只是C++,而OP在這裏似乎想要一個C解決方案。 – schot 2010-08-11 07:10:58