Gegenteil von C-Präprozessor “Stringifizierung”

Lesezeit: 2 Minuten

Benutzeravatar von MasterM
MeisterM

Bei Verwendung des C-Präprozessors kann man Makroargumente wie folgt stringifizieren:

#define TO_STRING(x) "a string with " #x

und so ist das Ergebnis bei Verwendung wie folgt:

TO_STRING(test) wird erweitert zu: "a string with test"

Gibt es eine Möglichkeit, das Gegenteil zu tun? Ein String-Literal als Eingabeargument erhalten und einen C-Bezeichner erzeugen? Zum Beispiel:

TO_IDENTIFIER("some_identifier") würde erweitern zu: some_identifier

Danke für deine Antworten.

EDIT: Für diejenigen, die sich fragen, wofür ich es brauche:

Ich wollte auf Knoten in einem Szenendiagramm meiner 3D-Engine durch String-Identifikatoren verweisen, aber gleichzeitig vermeiden, Strings in engen Schleifen zu vergleichen. Also dachte ich, ich schreibe ein einfaches Tool, das im Pre-Build-Schritt der Kompilierung ausgeführt wird und nach vordefinierten Zeichenfolgen sucht – zum Beispiel ID("something"). Dann würde es für jedes solche Token CRC32 der Zeichenfolge zwischen den Klammern berechnen und eine Header-Datei mit #defines generieren, die diese numerischen Kennungen enthält. Zum Beispiel für die Schnur "something" es wäre:

#define __CRC32ID_something 0x09DA31FB

Dann würde die generierte Header-Datei von jeder verwendeten cpp-Datei eingeschlossen werden ID(x) Makros. Das ID("something") würde natürlich erweitern __CRC32ID_something, was der Compiler also tatsächlich sehen würde, sind einfache ganzzahlige Bezeichner anstelle von benutzerfreundlichen Zeichenfolgen. Natürlich werde ich mich jetzt einfach damit zufrieden geben ID(something) aber ich dachte, dass die Verwendung von Anführungszeichen sinnvoller wäre – ein Programmierer, der nicht weiß, wie das geht ID Makroarbeiten können das denken something ohne Anführungszeichen ist ein C-Bezeichner, obwohl ein solcher Bezeichner in Wirklichkeit überhaupt nicht existiert.

  • Aus Neugier, wie wäre das nützlich?

    – Kerrek SB

    8. August 2011 um 12:35 Uhr

  • Sie tun entweder etwas für einen wirklich seltsamen Anwendungsfall oder machen es völlig falsch. Bitte beschreiben Sie das eigentliche Problem.

    – the_drow

    8. August 2011 um 12:37 Uhr

  • Dazu braucht man einen C-Interpreter 🙂

    – gebraucht

    8. August 2011 um 12:43 Uhr

  • Für diejenigen, die es wissen wollten, eine Erklärung hinzugefügt. 🙂

    – MeisterM

    8. August 2011 um 20:53 Uhr

  • Ich habe oft gegoogelt, um eine Lösung zu finden, leider gibt es im Moment keine Lösung, diese Option (destringify) ist sehr nützlich, um einen faktorisierten C-Code zu schreiben.

    – elhadi dp ıpɐɥןǝ

    14. März 2013 um 9:25 Uhr

Nein, man kann nichts entstringen.

  • Allgemeiner kann der Präprozessor Token zusammenfügen, aber er kann einen Token nicht auseinanderbrechen.

    – Keith Thompson

    8. August 2011 um 16:04 Uhr

//unstringify test

enum fruits{apple,pear};

#define IF_WS_COMPARE_SET_ENUM(x) if(ws.compare(L#x)==0)f_ret=x;

fruits enum_from_string(wstring ws)
{
 fruits f_ret;
 IF_WS_COMPARE_SET_ENUM(apple)
 IF_WS_COMPARE_SET_ENUM(pear)
 return f_ret;
}

void main()
{
 fruits f;
 f=enum_from_string(L"apple");
 f=enum_from_string(L"pear");
}

  • @FDinoff: Besser nicht.

    – alecov

    25. Juni 2014 um 16:50 Uhr


  • Dies funktioniert möglicherweise nur, wenn Sie Ihre “Datenbank” aus konstanten Zeichenfolgen erstellen enum_from_string()sonst nicht :/, aber interessant 🙂

    – Wassermannkraft

    1. Juni 2018 um 22:01 Uhr


1402820cookie-checkGegenteil von C-Präprozessor “Stringifizierung”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy