2009-12-09 20 views
16

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?

+0

Einige verwandte Materialien hier: http://stackoverflow.com/questions/25749/what-does-the-symbol-represent-in-objective-c – Felixyz

Antwort

1

Ein Blick auf die Objective-C Programming Language gibt Ihnen einige Hinweise darüber, was möglich ist oder nicht. Da einige "Schlüsselwörter" in einer Header-Datei definiert sind, kann deren Substitution zu beobachtetem (und unerwartetem) Verhalten führen.

+0

Right. Die Frage ist also: Gibt es * irgendwelche * in Bona Fide reservierten Schlüsselwörter in Objective-C (über diejenigen, die bereits in C reserviert sind)? – Felixyz

+1

Es gibt keine reservierten Schlüsselwörter wie in anderen Sprachen. Es ist eher wie definiert, die schlecht mit Ihrem Code interagieren können. Es kommt auf die Pre-Prozessor-Arbeit an. –

1

Wikipedia definiert Stichworte wie:

In der Computerprogrammierung, ein Schlüsselwort ist ein Wort oder eine Kennung, die eine besondere Bedeutung in die Programmiersprache hat.

Ich würde das übersetzen zu: Ein Schlüsselwort in einer Sprache ist ein Nicht-Terminal in seiner Grammatik. (Übrigens enthält die Grammatik nicht das Wort "Schlüsselwort" allein, also keine Verwirrung dort).

Die Terminals im grammar würde:

  • Leere
  • char
  • kurz
  • int
  • lange
  • float
  • Doppel
  • unterzeichnet
  • unsigned
  • ID
  • const
  • volatile
  • in
  • out
  • INOUT-
  • bycopy
  • byref
  • Einwege
  • Selbst
  • Super
  • @interface
  • @end
  • @implementation
  • @end
  • @interface
  • @end
  • @implementation
  • @end
  • @protoco
  • @end
  • @class
+0

Die Frage ist, welche reservierten Schlüsselwörter ObjC ** zu C hinzufügen könnte. Wie Sie in den Beispielen sehen können, können Sie "in" als Namen einer Variablen verwenden, so dass es eindeutig nicht als reserviertes Schlüsselwort gilt . – Felixyz

+1

Ich meine, die Tatsache, dass "int float = 45;" kann nicht kompiliert werden, während "int id = 45;" kompiliert erzählt uns etwas. – Felixyz

+0

sie sind keine "Beispiele". Es ist die vollständige Liste, soweit ich sehen kann. Und gut, es hängt davon ab, was Sie ein Keyword nennen möchten. Ich habe dir meine Antwort auf diese Frage gegeben. – nes1983

1

Sie könnten The Objective-C Programming Language überprüfen.

Soweit ich das beurteilen kann, klassifiziert dieses Dokument nichts als "reserviertes Wort". Die @implementation, @interface usw. werden "Compiler-Direktiven" genannt.

9

Alle waren sich einig, dass @interface, @implementation usw. sind alle Pre-Prozessor-Richtlinien statt Schlüsselwörter

Dann waren alle falsch. #import und #pragma sind Präprozessordirektiven. @interface, @implementation, @protocol und so weiter sind Schlüsselwörter von Objective-C, und sie sind Compiler Richtlinien. Sie waren keine Präprozessordirektiven, da NeXT GCC erweiterte, um Objective-C ohne die originale Objective-C-Preprozessor-Implementierung von Stepstone zu kompilieren.

+0

Dann würde das bedeuten, dass @interface ein Schlüsselwort ist (in dem Sinne, wie es in der obigen Editierung angegeben ist), aber id nicht, weil der Compiler es ablehnt zB "int @interface = 1;" aber glücklich verwendet ID als der Name für ein int. Der Compiler erlaubt aber auch nicht "int @icecream = 1;". Also, wo bleibt uns das? #import - Präprozessordirektive @interface - Compiler Direktive @ - reserviertes Zeichen id/self/in - spezielle Bedeutung in einigen Kontexten aber nicht reserviert – Felixyz

+0

id ist ein typedef. Sie können es in objc.h finden – NSResponder

4

Re: Nikolai Rühe deutet darauf hin, dass selbst ein Stichwort

ist self wird ein Parameter auf eine Objective-C-Methode vom Typ id (ähnlich wie _cmd ist auch ein param vom Typ SEL) und kein Schlüsselwort. nil ist ein Makro, das auf NULL erweitert wird. Ich bin ein wenig enttäuscht, dass super nicht zu einem Makro erweitert, noch ist es ein Parameter.

Vom Eintrag wikipedia:

Objective-C eine dünne Schicht auf der Oberseite des C ist, und ist darüber hinaus eine strenge Obermenge von C. Es ist möglich, jedes C-Programm mit einem Objective-C-Compiler zu kompilieren, und C-Code innerhalb einer Objective-C-Klasse frei enthalten.

Das würde verhindern, dass Objective-C die Sprache mit eingeschränkten Stichwörtern ergänzt.

+0

Das ist ein sehr guter Punkt, obwohl die Beschränkung offenbar nicht vollständig von gcc respektiert wird. – Felixyz

+0

Die Schlussfolgerung ist nicht wahr. Eine Obermenge einer Sprache kann Schlüsselwörter hinzufügen, indem sie Begriffe verwendet, die in der Originalsprache unzulässig sind. Und genau das macht Objective-C. –

+0

Wenn 'super' kein Makro ist: Der Compiler muss' super' erkennen können, da er den korrekten Nachrichtentyp verwenden muss (Aufruf von 'objc_msgSendSuper' anstelle von 'objc_msgSend'). 'super' zeigt auf das selbe Objekt wie' self', also macht es keinen Sinn, es auch anders zu argumentieren. –

2

Grammar in Appendix B of the original 1995 booksuper definiert als "literal Symbol" terminal und es ist ein Spezialfall in dem Nachrichtenempfänger Syntax.

in Literal-Symbol ist ein Teil von protokoll Qualifier in ObjC 1,0 und wurde in schnellen Auszählung Syntax in ObjC 2.0 (die keine formale Grammatik Definition AFAIK haben) wieder verwendet.

id als Teil Typ-specifier definiert ist neben void, char, unsigned, typedefed Typen, etc. Wenn Sie void ein Stichwort nennen, dann ist id auch.

Verwandte Themen