SORU
14 EKİM 2008, Salı


Basit bir komut dize için C numaralama dönüştürmek için var mı?

Çeteleler adlı: biraz düşün

enum MyEnum {
      FOO,
      BAR = 0x50
};

Google'dan baktım, ne projemde tüm başlıkları tarar ve numaralama başına bir işlevi olan bir başlığı oluşturan bir komut dosyası (herhangi bir dil).

char* enum_to_string(MyEnum t);

Ve bir şey ile bir uygulama bu

char* enum_to_string(MyEnum t){
      switch(t){
         case FOO:
            return "FOO";
         case BAR:
            return "BAR";
         default:
            return "INVALID ENUM";
      }
 }

Bu yakaladım gerçekten typedefed çeteleler ve isimsiz C tipi çeteleler. Kimse bunun için bir şey biliyor mu?

EDİT: kaynağım değiştirmemelidir çözüm oluşturulan fonksiyonları hariç. Çeteleler bir API vardır, şimdiye kadar önerilen çözümleri kullanarak sadece bir seçenek değildir.

CEVAP
14 EKİM 2008, Salı


X-makrolar en iyi çözümdür. Örnek:

#include <iostream>

enum Colours {
#   define X(a) a,
#   include "colours.def"
#   undef X
    ColoursCount
};

char const* const colours_str[] = {
#   define X(a) #a,
#   include "colours.def"
#   undef X
    0
};

std::ostream& operator<<(std::ostream& os, enum Colours c)
{
    if (c >= ColoursCount || c < 0) return os << "???";
    return os << colours_str[c];
}

int main()
{
    std::cout << Red << Blue << Green << Cyan << Yellow << Magenta << std::endl;
}

renkler.def:

X(Red)
X(Green)
X(Blue)
X(Cyan)
X(Yellow)
X(Magenta)

Ancak, ben mümkün dize biraz değiştirmek için genellikle aşağıdaki yöntemi tercih ederler.

#define X(a, b) a,
#define X(a, b) b,

X(Red, "red")
X(Green, "green")
// etc.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS Campus Life

    ASUS Campus

    18 Mart 2013
  • friendz.net

    friendz.net

    29 EKİM 2010
  • xSammyJoe1

    xSammyJoe1

    19 Temmuz 2011