Verketten Sie int mit dem C-Präprozessor zu einer Zeichenfolge

Lesezeit: 3 Minuten

Benutzeravatar von jonescb
jonescb

Ich versuche herauszufinden, wie ich a verketten kann #define‘d int zu a #define‘d Zeichenfolge mit der C Präprozessor. Mein Compiler ist GCC 4.1 auf CentOS 5. Die Lösung sollte auch für MinGW funktionieren.

Ich möchte eine Versionsnummer an eine Zeichenfolge anhängen, aber die einzige Möglichkeit, dies zum Laufen zu bringen, besteht darin, eine Kopie der Versionsnummer zu erstellen, die als Zeichenfolgen definiert ist.

Das nächste, was ich finden konnte, war eine Methode zum Zitieren von Makroargumenten, aber es funktioniert nicht #defines

Dies funktioniert nicht.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER

Ohne geht es nicht #s entweder, weil die Werte Zahlen sind und es erweitert werden würde "/home/user/.myapp" 2 6was nicht gültig ist C.

Das funktioniert, aber ich mag es nicht, Kopien der Versionsdefinitionen zu haben, weil ich sie auch als Zahlen brauche.

#define MAJOR_VER 2
#define MINOR_VER 6
#define MAJOR_VER_STR "2"
#define MINOR_VER_STR "6"
#define MY_FILE "/home/user/.myapp" MAJOR_VER_STRING MINOR_VER_STRING

  • Mögliches Duplikat von Convert a preprocessor token to a string

    – Ciro Santilli OurBigBook.com

    5. Oktober 2015 um 13:00 Uhr

Klassische C-Präprozessorfrage ….

#define STR_HELPER(x) #x
#define STR(x) STR_HELPER(x)

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" STR(MAJOR_VER) STR(MINOR_VER)

Die zusätzliche Indirektionsebene ermöglicht es dem Präprozessor, die Makros zu erweitern, bevor sie in Zeichenfolgen konvertiert werden.

  • STR() ergibt in diesem Fall eine schmale Zeichenfolge. Gibt es eine Variation, um dies in eine breite Zeichenfolge umzuwandeln?

    – gkns

    25. August 2016 um 8:57 Uhr

  • Ich kann nicht sagen, wie oft ich es gegoogelt und genau diese Antwort kopiert habe, aber es wird zweistellig sein

    – Mächtiges Schweinefleisch

    14. Dezember 2018 um 19:04 Uhr

  • Das erste “STR_HELPER” ist erforderlich, da “#” nur mit einem Makroargument funktioniert. Ich habe einige Zeit gebraucht, um das herauszufinden..

    – clarktfu

    14. Mai 2020 um 9:30 Uhr

  • @clarkttfu, irgendwie – ja, # funktioniert nur mit Makroargumenten. Allerdings ist die STR_HELPER Makro wird benötigt, um ein Drehen des Makros zu vermeiden MAJOR_VER in die Saite "MAJOR_VAR"wo wir das Ergebnis haben wollen "2".

    – Lindydancer

    14. Mai 2020 um 15:28 Uhr

  • Mein Gehirn tut weh, dass dies nicht mit einem einzigen Makro möglich ist … Wie viele andere Leute, habe ich dies Dutzende Male verwendet

    – Andrejs Gasilovs

    14. September 2021 um 10:03 Uhr

Benutzeravatar von Giuseppe Guerrini
Giuseppe Guerrini

Eine funktionierende Methode besteht darin, MY_FILE als parametrisches Makro zu schreiben:

#define MY_FILE(x,y) "/home..." #x #y

BEARBEITEN: Wie von “Lindydancer” angemerkt, erweitert diese Lösung keine Makros in Argumenten. Eine allgemeinere Lösung ist:

#define MY_FILE_(x,y) "/home..." #x #y
#define MY_FILE(x,y) MY_FILE_(x,y)

  • Meiner ehrlichen Meinung nach ist dies die beste Antwort und viel einfacher als die anderen Vorschläge. Ich bin überrascht, dass es keine bessere Bewertung bekommen hat!

    – Osirisgothra

    26. Oktober 2013 um 10:56 Uhr

  • Es ist eine saubere Lösung, die leider nicht funktioniert. Wenn das Argument übergeben wird MY_FILE sind Makros, sagen wir A und Bwird dieses Makro erweitert "/home..." "A" "B".

    – Lindydancer

    2. September 2014 um 6:14 Uhr

Das kannst du mit BOOST_PP_STRINGIZE:

#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)

  • Bringt mich zum Grinsen, wie Leute Boost auf alles werfen.

    – Frerich Raabe

    28. März 2011 um 13:53 Uhr

  • @Frerich: Wenn Sie Ihr Argument auf die Spitze treiben, sollten die Leute zuerst ihre eigenen Compiler in rohem Maschinencode schreiben, anstatt g ++ auf alles zu werfen … Es hat keinen Sinn, das Rad neu zu erfinden. Gute Programmierer schreiben Code, gute verwenden ihn wieder.

    – Maxim Egorushkin

    28. März 2011 um 13:57 Uhr


  • @jonescb: einfach öffnen der Boost-Header und sehen Sie selbst.

    – Maxim Egorushkin

    28. März 2011 um 14:01 Uhr


  • Ja, ich habe es versucht. Es hat funktioniert, aber die Verwendung eines Boost-Headers in einem C-Programm erscheint mir irgendwie seltsam.

    – jonescb

    28. März 2011 um 14:03 Uhr

  • Oh, mein schlechtes, nicht bemerkt C Schild.

    – Maxim Egorushkin

    28. März 2011 um 14:05 Uhr

1421680cookie-checkVerketten Sie int mit dem C-Präprozessor zu einer Zeichenfolge

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

Privacy policy