2012-03-23 12 views
1

Ich habe dieses Makro beim Graben in dem Quellcode tweejump Spiels gefunden.Makro Erklärung

#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__) 

Für mich cpp ist es nur Pseudonym zu CGPointMake. Warum wird das gebraucht?

Antwort

3
  1. cpp weniger zu geben, und
  2. jemand könnte die Zuordnung zu ändern, zum Beispiel

#ifndef DEBUG einige Debug um den Anruf zu wickeln
#define ccp(__X__,__Y__) CGPointMake(__X__,__Y__)
#else
#define ccp(__X__,__Y__) myassert2(((__X__) > 0),((__Y__) > 0), \
CGPointMake(__X__,__Y__))
#endif

Warum sollten wir das tun wollen? Wir können den Fehler für die Zeile des Quellcodes erhalten, die einen Fehler hat:

#define myassert2(xc1, c2, fun) ((c1) && (c2)? fun((c1),(c2)): \ 
     fprintf(stderr, "Error in file %s, line %d, c1=%d c2=%d\", \ 
         __FILE__, __LINE__, (c1), (c2)) 

BTW, in der Regel ist es sicherer für einen Makro ist, immer die Argumente in Klammern zu wickeln:

#define ccp(__X__,__Y__) CGPointMake((__X__),(__Y__)) 

aber als JamesDlin wies darauf hin, dass es in diesem Fall eines Funktionsaufrufs keine Rolle spielt.

IMHO ist es besser, eine ‚Regel‘ zu haben, die sicher, einfach zu erklären und sich zu erinnern, und nur variieren weg für guten Grund, anstatt eine komplexere Regel zu haben. Immerhin gibt es mehr interessante Probleme zu lösen (in meinem Code) als ob oder nicht Argumente eines Makros in Klammern zu umhüllen :-)

(Ich bin besonders auf einfache Regeln aufgrund einer aktuellen BBC Horizon Programm, die angeboten Hinweise darauf, dass Menschen auf einmal kann nicht erfolgreich über drei Dinge denken - (

(HELP Was der einfache Weg ist C-Präprozessor-Quellcode wie #if ... die {} nicht funktioniert hat, zurück Zecken didn‘zu formatieren!? t Arbeit, 4 führende Leerzeichen funktionierte nicht. Sie alle einige der führenden # Zeichen essen)

+0

Was ist eine Situation, wo die zusätzlichen Klammern egal wäre, wenn die Makro-Argumente als Argumente an eine Funktion übergeben werden? – jamesdlin

+0

Okay, um meine eigene Frage zu beantworten, behaupte ich, dass sie nicht wichtig sind und dass es so sicher ist wie es ist. https://www.securecoding.cert.org/confluence/display/seccode/PRE01-C.+Use+parentheses+within+macros+around+parameter+names#PRE01-C.Useparentheseswithinmacrosaroundparameternames-Exceptions scheint zuzustimmen. – jamesdlin

+0

Die einzige Zeit, die es bei einem Funktionsaufruf wichtig ist, ist C++. Die ',' Operation könnte einen Zwei-Parameter-Anruf in einen Drei-Parameter-Anruf ändern, der mit einer alternativen Signatur übereinstimmen könnte. Aber der Hauptpunkt ist, dass Makro-Parameter, die nicht in Klammern sind, sehr schwer Bugs entdecken können, daher ist es IMHO einfacher, sie immer hinzuzufügen. Wie Sie aus meinem Q & D-Debug-Code entnehmen können, könnte ein Tippfehler oder ein anderer Präzedenzoperator (niedriger als &&) einen Fehler verursachen.Leute nehmen häufig vorhandenen Code, als das Modell, wiederholen diese Muster und fügen kleine Stücke hinzu, also ist IMHO, das sicher beginnt, für die Zukunft hilfreich. Okay? – gbulmer

3

Es ist genau das: ein Alias ​​für CGPointMake. es ist viel einfacher, 3 Zeichen zu schreiben, als 9.

+0

faule Programmierer :)) – OhDoh

+0

Und viel schwieriger zu lesen ... –