Zastrzeżone słowa kluczowe w Objective-C?
Na spotkaniu CocoaHeads Öresund wczoraj,peylow skonstruował świetny quiz ObjC. Konkurs był intensywny, a trzy osoby otrzymały ten sam wynik, gdy miało zostać ocenione ostatnie pytanie: Ile zarezerwowanych słów kluczowych dodaje Objective-C do C?
Nastąpiła burzliwa debata. Wszyscy się zgodzili@interface
, @implementation
itd. są wszystkie dyrektywy preprocesorowe, a nie słowa kluczowe, ale jak coś takiegoin
? To może być słowo kluczowe, ale nie jestzarezerwowany słowo kluczowe. Na przykład poniższe kompilują się bez błędów lub ostrzeżeń:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
Doszliśmy do wniosku, że ObjC dodajeNie zarezerwowane słowa kluczowe do C, a ktoś wygrał pozornie zasłużoną książkę.
Ale dzisiaj próbowałem trochę bardziej systematycznego nadużywania kompilatora, próbując takich rzeczy:
int self = 45;
self++;
int y = self;
To dobrze się kompiluje i ten sam kod działa zastępując własny kodBOOL, bycopy, inout, oneway, byref, SEL,
iIMP
.
Za pomocąid
jako nazwa zmiennej, pierwsza i ostatnia linia kompilują się, ale nie druga. To samo dotyczyProtocol
, iClass
.
Za pomocąsuper
, pierwsza linia się kompiluje, ale nie druga i trzecia.
ZYES
, NO
, iNULL
, wszystkie trzy linie nie kompilują się, prawdopodobnie dlatego, że są zdefiniowane jakotrue
, false
, inil
.
Wygląda na to, że większość z nich jest zdezorientowana i nie jestem pewien, czy odzwierciedla to, co jest i nie jest zarezerwowanym słowem kluczowym w Objective-C. Dlaczego, na przykład, jest dobrze używaćself
jako nazwa int, ale niesuper
?
Fakt, że pierwsze zadanie zawsze działa (z wyjątkiem YES, NO i NULL) wydaje się potwierdzać pogląd, że żaden z kandydatów nie jest technicznie zastrzeżonym słowem kluczowym, którego nie ma w C. Lub?
Czy ktoś mógłby nam podać autorytatywne wyjaśnienie tej drażliwej kwestii?
Stawką jest honor kilku ludzi.
EDYCJA: Jak zauważył Nikolai Ruhe, potrzebujemy jasnej definicji „słowa kluczowego”, aby kontynuować. Niko przytoczył artykuł w Wikipedii mówiący, że słowo kluczowe to „słowo lub identyfikator, który ma szczególne znaczenie”.
Myślę, że rozsądne jest użycie tej definicji z tego samego artykułu:
W wielu językach, takich jak C i podobne środowiska, takie jak C ++, słowo kluczowe jest słowem zastrzeżonym, które identyfikuje formę składniową. Słowa używane w konstrukcjach przepływu sterowania, takie jak if, then, i else są słowami kluczowymi. W tych językach słowa kluczowe nie mogą być również używane jako nazwy zmiennych lub funkcji.
Ponadto, jak stwierdza artykuł:
Zazwyczaj, gdy programista próbuje użyć słowa kluczowego dla nazwy zmiennej lub funkcji, zostanie uruchomiony błąd kompilacji.
W tym sensie istnieją zatem jakieś zastrzeżone słowa kluczowepredefiniowane w formalnych specyfikacjach języka i nie mogą być używane jako nazwa zdefiniowana przez użytkownika?