Avatar billede thomas_fogh Nybegynder
10. november 2006 - 11:21 Der er 6 kommentarer

Print "navn" på enum værdier

Er det muligt at printe navnet på en enum værdi?
F.eks.

enum EnumTest
{
ENUM_TEST_1,
ENUM_TEST_2
};

void main()
{
EnumTest enumTest = ENUM_TEST_2;
printf("Value: %s", ENUM_VALUE_NAME(enumTest));
}

OUTPUT:
Value: ENUM_TEST_2
Avatar billede kenneth_gorking Nybegynder
10. november 2006 - 13:12 #1
Ikke umiddelbart, men med lidt arbejde er det muligt. Det er nok ikke hvad du mente, men det er den eneste måde jeg lige kan komme i tanke om:

enum EnumTest
{
    ENUM_TEST_1,
    ENUM_TEST_2
};

static char* EnumNames[] =
{
    "ENUM_TEST_1",
    "ENUM_TEST_2"
};
#define ENUM_VALUE_NAME(e) EnumNames[e]

void main()
{
    EnumTest enumTest = ENUM_TEST_2;
    printf("Value: %s", ENUM_VALUE_NAME(enumTest));
}
Avatar billede thomas_fogh Nybegynder
10. november 2006 - 13:17 #2
Nej, det var ikke det jeg mente, men tak for forsøget ;)
Avatar billede bertelbrander Novice
10. november 2006 - 19:53 #3
Hvad mener du så?
Navnet på en enum er ikke kendt af programmet når det kører, så man bliver nødt til at gemme dem selv.
Hvis man vil undgå at have navnene til at stå flere gange kan man:

#include <iostream>

#define ALL ONE(test1), ONE(test2)

#define  ONE(xx_) xx_
enum SomeEnum
{
  ALL
};

#undef ONE
#define ONE(xx_) #xx_
const char * const EnumName[] =
{
  ALL
};
#undef ONE

int main()
{
  SomeEnum Some = test1;
  std::cout << EnumName[Some] << std::endl;
}
Avatar billede arne_v Ekspert
15. november 2006 - 04:45 #4
en lidt anderledes variant (som kræver en nyere compiler):

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

string EnumName(int v, char *names)
{
    string res = "";
    int n = 0;
    for(int i = 0; i < strlen(names); i++)
    {
        if(names[i]==',')
        {
            n++;
        }
        else
        {
            if(n==v) res += names[i];
        }
    }
    return res;
}

#define ENUM(name,...) \
enum name##Enum { __VA_ARGS__ }; \
string name##Name(name##Enum v) { return EnumName((int)v, #__VA_ARGS__); };

ENUM(Some,test1,test2)
ENUM(Another,a,b,c,d,e,f)

int main()
{
    SomeEnum e;
    e = test1;
    cout << e << " " << SomeName(e) << endl;
    e = test2;
    cout << e << " " << SomeName(e) << endl;
    AnotherEnum e2;
    e2 = d;
    cout << e2 << " " << AnotherName(e2) << endl;
    return 0;
}
Avatar billede thomas_fogh Nybegynder
21. november 2006 - 15:39 #5
Ikke lige hvad jeg have brug for... (Det kan nok ikke lade sig gøre)
Avatar billede thomas_fogh Nybegynder
24. marts 2007 - 14:40 #6
Er der nogen som vil ha' points?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



IT-JOB