Auf dem CocoaHeads Öresund Treffen gestern, peylow hatte ein großes ObjC Quiz aufgebaut. Der Wettbewerb war intensiv und drei Leute hatten das gleiche Ergebnis, wenn die letzte Frage bewertet wurde: Wie viele reservierte Schlüsselwörter fügt Objective-C zu C hinzu?Reservierte Schlüsselwörter in Objective-C?
Eine lebhafte Debatte folgte. Alle waren sich einig, dass @interface
, @implementation
etc. alle Pre-Prozessor-Direktiven und nicht Schlüsselwörter sind, aber wie wäre es mit etwas wie in
? Es könnte ein Schlüsselwort sein, aber es ist kein reserviertes Schlüsselwort. Zum Beispiel wird im Folgenden ohne Fehler oder Warnungen kompilieren:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
Wir schlossen daraus, dass ObjC keine reservierten Schlüsselwörter zu C addiert, und jemand hat eine scheinbar wohlverdienten Buch.
Aber heute habe ich versucht, etwas systematischen Missbrauch auf dem Compiler durch Dinge wie dies versuchen:
int self = 45;
self++;
int y = self;
Die fein kompiliert, und der gleiche Code funktioniert für BOOL, bycopy, inout, oneway, byref, SEL,
und IMP
selbst zu ersetzen.
Mit id
als Variablenname, die ersten und letzten Zeilen kompilieren, aber nicht die zweite. Das gleiche gilt für Protocol
und Class
.
Mit super
wird die erste Zeile kompiliert, aber nicht die zweite und dritte Zeile.
Mit YES
, NO
und NULL
alle drei Linien ausfallen, wahrscheinlich zu kompilieren, weil sie nur als true
definiert, false
und nil
.
Es mir wie eine Menge aussieht ist gcc immer verwirrt und ich bin nicht so sicher, dass es reflektiert, was ist und nicht ein reserviertes Schlüsselwort in Objective-C. Warum ist es beispielsweise in Ordnung, self
als den Namen eines int zu verwenden, aber nicht super
?
Die Tatsache, dass die erste Zuweisung immer funktioniert (außer mit JA, NEIN und NULL) scheint die Idee zu unterstützen, dass keiner der Kandidaten technisch reservierte Schlüsselwörter sind, die nicht in C gefunden werden. Oder?
Könnte jemand bitte geben Sie uns eine verbindliche Erklärung dieser heiklen Frage?
Mehrere Menschen die Ehre auf dem Spiel steht.
EDIT: Wie Nikolai Ruhe wies darauf hin, brauchen wir eine klare Definition des Begriffs "Keyword", um fortzufahren. Niko zitiert einen Wikipedia-Artikel, der sagt, dass ein Schlüsselwort "ein Wort oder eine Kennung ist, die eine bestimmte Bedeutung hat".
Ich denke, dass es sinnvoll ist, diese Definition aus dem gleichen Artikel zu verwenden:
In vielen Sprachen wie C und ähnliche Umgebungen wie C++, ein Schlüsselwort ist ein reserviertes Wort, das ein syntaktische identifiziert bilden. Wörter in Kontrollflusskonstrukte verwendet, wie als ob, dann, und sonst sind Schlüsselwörter.In diese Sprachen, Schlüsselwörter können nicht auch als Namen von Variablen oder Funktionen verwendet werden.
Darüber, wie der Artikel heißt es:
Normalerweise, wenn ein Programmierer versucht ein Schlüsselwort für eine Variable oder Funktionsnamen zu verwenden, ein Übersetzungsfehler ausgelöst.
In diesem Sinne, gibt es dann reservierte Schlüsselwörter, die predefined in the language’s formal specifications and cannot be used as a user-defined name sind?
Einige verwandte Materialien hier: http://stackoverflow.com/questions/25749/what-does-the-symbol-represent-in-objective-c – Felixyz