Ich versuche herauszufinden, wie ich mit dem C- Präprozessor ein #define
'd int mit einem #define
' d-String verketten kann . Mein Compiler ist GCC 4.1 unter 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, sie 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 für #define
s
Das funktioniert nicht.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Es funktioniert nicht ohne die #
s entweder , weil die Werte Zahlen sind und es würde zu erweitern "/home/user/.myapp" 2 6
, die 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
quelle
Antworten:
Klassische C-Präprozessor-Frage ....
Durch die zusätzliche Indirektionsebene kann der Präprozessor die Makros erweitern, bevor sie in Zeichenfolgen konvertiert werden.
quelle
#
funktioniert nur mit Makroargumenten . DasSTR_HELPER
Makro wird jedoch benötigt, um zu vermeiden, dass das MakroMAJOR_VER
in eine Zeichenfolge umgewandelt wird"MAJOR_VAR"
, in der das Ergebnis angezeigt werden soll"2"
.Eine Arbeitsweise besteht darin, MY_FILE als parametrisches Makro zu schreiben:
BEARBEITEN: Wie von "Lindydancer" festgestellt, erweitert diese Lösung keine Makros in Argumenten. Eine allgemeinere Lösung ist:
quelle
MY_FILE
Makros sind, z. B.A
undB
, wird dieses Makro auf erweitert"/home..." "A" "B"
.Sie können dies mit BOOST_PP_STRINGIZE tun :
quelle
C
Tag nicht bemerkt .