2

Ich freue mich auf einige Open-Source-Projekte und ich sehe die folgenden:C Präprozessor auf Mac OSX/iPhone, Verwendung der '#' Taste?

NSLog(@"%s w=%f, h=%f", #size, size.width, size.height) 

Was genau die Bedeutung von ‚#‘ ist direkt vor der Größe Symbol? Ist das eine Art Präfix für C Strings?

+0

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. –

+0

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

Antwort

4

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; 
4

Ist dies der Körper einer Makrodefinition? Dann könnte die # verwendet werden, um den folgenden Identifizierer zu stringieren, d.h. um "string" (ohne die Codes) zu drucken.

8

Um die Antwort von dirkently zu erläutern, sieht dies wie die Implementierung eines Makros aus, das ein NSSize (oder ähnliches) Argument verwendet und den Namen der Variablen ausgibt (was der # tut; den Namen der Variablen umwandelt) zu einer Zeichenkette, die den Namen der Variablen enthält) und dann ihre Werte. So in:

NSSize fooSize = NSMakeSize(2, 3); 
MACRO_NAME_HERE(fooSize); 

würde das Makro erweitern:

NSLog(@"%s w=%f h=%f", "fooSize", fooSize.width, fooSize.height); 

und Druck:

fooSize w=2.0 h=3.0 

(ähnlich wie NSStringFromSize, aber mit dem Variablennamen)