2 Stimmen

Stringifizierung bei einem Aufzählungselement

Ich muss ein Aufzählungselement (seinen Wert, nicht den Bezeichner) in eine Zeichenfolge konvertieren. Ich habe Folgendes versucht, das für ein MACRO (TYPE_A) funktioniert, aber nicht für einen Enum-Wert (typeA). Dies ist meiner Meinung nach ein wenig seltsam.

Haben Sie eine Idee, wie man das macht?

#define _tostr(a) #a
#define tostr(a) _tostr(a)

typedef enum _SPECIAL_FOLDER_ID {
    typeA = 3,
    typeB = 4,
} SPECIAL_FOLDER_ID;

#define TYPE_A 3

int main() {
    //this is working, but the information is a macro (TYPE_A)
    printf("The string is " tostr(TYPE_A) ".\n");

    //this is not working for typeA (defined in an enumeration)
    printf("The string is " tostr(typeA) ".\n");
    return 0;
}

Die Ausgabe ist:

The string is 3.
The string is typeA.

Ich muss den Code in irgendeiner Weise ändern, damit die zweite Zeile der Ausgabe "Die Zeichenfolge ist 3" lautet.

Gracias.

PS: Ich möchte den Wert nicht mit printf drucken. Ich brauche eine statische Zeichenfolge, die diesen Wert enthält. Ich verwende printf nur, um das Ergebnis zu testen...

5voto

pmg Punkte 102904

Der Präprozessor kennt kein C. Er kennt nur "Text".
Wenn Ihre Datei verarbeitet wird, typeA besteht aus nur 5 Buchstaben. Nur der Compiler wird wissen (nachdem der Präprozessor fertig ist), dass typeA einen Wert hat, und dass dieser Wert 3 ist.

3voto

Christoph Punkte 157217

Es gibt nicht wirklich eine gute Möglichkeit, dies zu erreichen. Das Beste, was mir einfällt, ist

#define typeA_ 3
#define typeB_ 4

enum
{
    typeA = typeA_,
    typeB = typeB_
};

#define tostr__(E) #E
#define tostr_(E) tostr__(E)
#define tostr(E) tostr_(E ## _)

1voto

Goz Punkte 59671

Was ist an den folgenden Punkten falsch?

printf("The string is %d.\n", typeA );

Sie scheinen die Dinge etwas zu sehr zu verkomplizieren ...

1voto

gnud Punkte 75549

Die Verwendung der beiden verschachtelten Makros ist ein Trick, der den Präprozessor zwingt, alle Makroargumente zu expandieren (TYPE_A -> 3).

Enum-Werte werden jedoch nicht durch den Präprozessor, sondern durch den Compiler expandiert.

1voto

Aftermathew Punkte 1928

Ich neige dazu, den Ansatz des statischen Arrays zu verwenden. Es ist immer noch ein Klumpen, aber es ist einigermaßen klar und es funktioniert.

enum {
  typeA = 3,
  typeB = 4,
  NUM_LETTERS = 5
} Letters;

static const char* letterNames[NUM_LETTERS] {
  "", "", "",
  "3",
  "4"
};

printf("The string is " letterNames[(int)typeA] ".\n");

Es sieht so aus, als ob Christophs Antwort gut ist, aber ich muss ehrlich sagen, dass ich nicht genug mit Makros vertraut bin, um sie zu verstehen ;-)

Bearbeiten; Eine andere Möglichkeit: Sie erwähnen, dass Sie eine "statische Zeichenfolge" wollen, aber ich bin nicht sicher, dass Sie es zur Kompilierzeit benötigen. Können Sie sprintf zu Beginn der Laufzeit verwenden? Diese Lösung würde etwa so aussehen...

enum {
  typeA = 3,
  typeB = 4,
  NUM_LETTERS = 5
} Letters;

int main(void){
    char * typeAString = new char[sizeof("This is at least as long as the typeA string")];
    sprintf(typeAString, "This is the %d string", typeA);
    // use your string here
    return 0;
}

Die Art und Weise, wie ich new hier verwendet habe, ist nicht das, was ich empfehlen würde, aber es zeigt die Idee der Verwendung von sprintf in Ihrem Programm.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X