Bunu yapmak için önişlemci kullanabilirsiniz, ben bu teknik X-Macros denir inanıyoruz: Son giriş (ama C89 olarak) C99 izin verilen bir sondaki virgül içerir
/* 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
};
Not söyledi. Bu bir sorunsa, sentin değerleri ekleyebilirsiniz.
X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */
Sınırlamaları: vb, özel isimleri veya numaralandırma değerleri için birden fazla argüman vererek makro daha karmaşık hale getirmek için de mümkündür Negatif sabitleri olamaz ve dizi sizeof (char *) * largest_constant
olduğunu.
Ama fazladan bir arama tablosu kullanarak hem etrafında işe yarayabilir: Bu tabii çalışmıyor
int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};
. iş adları için anahtarları olarak enum
sabitler ilave bir dizi oluşturuyor Ne yapar:
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
};
Şimdi fruit_name[PINEAPPLE_KEY]
kullanarak X(PINEAPPLE, Pineapple, -40)
adını bulabilirsiniz.
Ekstra dosya içermediklerini belirten kişiler. Bu ek dosyaya ihtiyacınız yok, ayrıca bir #define
kullanın. Bu küçük listeler için daha uygun olabilir:
#define FRUIT_LIST X(APPLE) X(ORANGE)
Ve önceki örneklerde FRUIT_LIST
ile #include "fruits.def
değiştirin. Ben bu tür bir makro almak için başarılı bir önişlemci programlama kullandım
Olası Bunların hepsi bir SSS olduğunu http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text –
çoğaltmak kontrol etmedim, ancak intertubes üzerinde ve büyük olasılıkla bir dupe burada. Cevap: hayır, yapamazsınız (@Naveen gibi çemberler aracılığıyla sersemlemeden ve eşzamanlılıktan kaçma riskini üstlenmeden) Eğer bu riski almaya hazırsanız, insanın bir yargıcı bu çözümü kullanır gibi görünüyor. ama cazip bir kader ...). – Mawg
@Eugen Constantin Dinca Bu soru sadece C++ iken, OP burada bir C çözümü istiyor gibi görünüyor. – schot