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