Die offizielle Der Name #
ist der Stringisierungsoperator. Es nimmt sein Argument und umgibt es in Anführungszeichen, um eine C-Zeichenkette konstant zu machen, wobei alle eingebetteten Anführungszeichen oder umgekehrten Schrägstriche nach Bedarf entfernt werden. Es ist nur innerhalb der Definition eines Makros erlaubt - im regulären Code ist es nicht erlaubt. Zum Beispiel:
// This is not legal C
const char *str = #test
// This is ok
#define STRINGIZE(x) #x
const char *str1 = STRINGIZE(test); // equivalent to str1 = "test";
const char *str2 = STRINGIZE(test2"a\""); // equivalent to str2 = "test2\"a\\\"";
Ein verwandter Präprozessor Operator ist der Token-Einfügen Operator##
. Es braucht zwei Token und fügt sie zusammen, um einen Token zu erhalten. Wie der Stringing-Operator ist er nur in Makrodefinitionen erlaubt, nicht in regulärem Code.
// This is not legal C
int foobar = 3;
int x = foo ## bar;
// This is ok
#define TOKENPASTE(x, y) x ## y
int foobar = 3;
int x = TOKENPASTE(foo, bar); // equivalent to x = foobar;
Neugierig ... Sie würden nicht zufällig den Namen des eigentlichen Projekts griffbereit haben, und die Position dieses Codes, würden Sie? Es muss noch etwas anderes vor sich gehen, wie es sich rührend anhört, denn das kompiliert nicht für mich. –
Es stammt eigentlich von Joe Hewitts Three20 Projekt. Die Definition sieht folgendermaßen aus: #define TTLOGRECT (rect) \ TTLOG (@ "% sx =% f, y =% f, w =% f, h =% f", #rect, rect.origin.x , rect.origin.y, \ rect.size.width, rect.size.height) – Coocoo4Cocoa