Ich versuche herauszufinden, wie ich einen #define
'D int mit dem [~ # ~] c [zu einem #define
' D String verketten kann. ~ # ~] 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, diese 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, die jedoch für #define
Nicht funktioniert
Das geht nicht.
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" #MAJOR_VER #MINOR_VER
Ohne die #
Funktioniert es auch nicht, weil die Werte Zahlen sind und sich zu "/home/user/.myapp" 2 6
Erweitern würden, was 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
Klassische C-Präprozessor-Frage ....
#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)
Durch die zusätzliche Indirektionsebene kann der Präprozessor die Makros erweitern, bevor sie in Zeichenfolgen konvertiert werden.
Eine Arbeitsweise besteht darin, MY_FILE als parametrisches Makro zu schreiben:
#define MY_FILE(x,y) "/home..." #x #y
EDIT: Wie von "Lindydancer" bemerkt, 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)
Sie können dies mit BOOST_PP_STRINGIZE tun:
#define MAJOR_VER 2
#define MINOR_VER 6
#define MY_FILE "/home/user/.myapp" BOOST_PP_STRINGIZE(MAJOR_VER) BOOST_PP_STRINGIZE(MINOR_VER)