wake-up-neo.com

Verketten Sie int mit C Preprocessor mit string

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
78
jonescb

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.

139
Lindydancer

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)
10

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)
2