Stringizing
-
Versuche gerade ein Define zu "stringizen".
Was ist der Unterschied zwischen STRING1 und STRING2? STRING1 zeigt das Jahr als Zahl an (OK), aber STRING2 ist der Name des Defines?! Das verstehe ich leider nicht so ganz.
#include <stdio.h> #define YEAR 2013 #define STRINGIZE1(x) STRINGIZE2(x) #define STRINGIZE2(x) #x #define STRING1 STRINGIZE1(YEAR) #define STRING2 STRINGIZE2(YEAR) int main() { printf("%s\n", STRING1); printf("%s\n", STRING2); return 0; } Ausgabe: 2013 YEAR
-
Mit folgender Header Datei generiere ich aus der Konstanten YEAR und VERSION jeweils den entsprechenden String: YEAR_STRING und VERSION_STRING:
#ifndef VERSION_H_ #define VERSION_H_ #define YEAR 2013 #define VERSION 01 #define STRINGIZE1(x) STRINGIZE2(x) #define STRINGIZE2(x) #x #define YEAR_STRING STRINGIZE1(YEAR) #define VERSION_STRING STRINGIZE1(VERSION) #define COMPOUND_INT YEAR*100+VERSION #define COMPOUND_STRING YEAR_STRING"."VERSION_STRING #endif // VERSION_H_
Strings kann ich dann schon zur Compilezeit zusammensetzen, was bei Integern etwas unschön ist, da sich kein "." einfügen lässt.
Und so etwas wäre ohne Stringizing auch kaum möglich:
#define YEAR 2013 #define VERSION 01B
-
Ist folgender Code ANSI konform?
#ifndef VERSION_H_ #define VERSION_H_ #define STRINGIZE1(x) STRINGIZE2(x) #define STRINGIZE2(x) #x #define YEAR 2013 #define MINOR_VERSION 01RC #define VERSION STRINGIZE1(YEAR)"."STRINGIZE1(MINOR_VERSION) #endif // VERSION_H_