Зарезервированные ключевые слова в Objective-C?
На вчерашней встрече CocoaHeads Öresund,peylow построил отличную викторину ObjC. Соревнование было интенсивным, и три человека остались с одинаковым баллом, когда нужно было оценить последний вопрос: сколько зарезервированных ключевых слов Objective-C добавляет к C?
Последовали оживленные дебаты. Все согласились с тем, что@interface
, @implementation
и т.д. все директивы препроцессора, а не ключевые слова, но как насчет чего-то вродеin
? Это может быть ключевое слово, но это незарезервированный ключевое слово. Например, следующее будет скомпилировано без ошибок или предупреждений:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
Мы пришли к выводу, что ObjC добавляетнет зарезервировал ключевые слова для C, и кто-то выиграл, казалось бы, заслуженную книгу.
Но сегодня я попробовал более систематическое злоупотребление компилятором, попробовав что-то вроде этого:
int self = 45;
self++;
int y = self;
Это прекрасно компилируется, и тот же код работает, заменяя себя наBOOL, bycopy, inout, oneway, byref, SEL,
а такжеIMP
.
С помощьюid
в качестве имени переменной компилируются первая и последняя строки, но не вторая. То же самое касаетсяProtocol
, а такжеClass
.
С помощьюsuper
первая строка компилируется, но не вторая и третья.
С участиемYES
, NO
, а такжеNULL
все три строки не могут быть скомпилированы, возможно потому, что они просто определены какtrue
, false
, а такжеnil
.
Мне кажется, что многое из-за того, что gcc запутался, и я не уверен, что оно отражает зарезервированное ключевое слово в Objective-C. Почему, например, это нормально использоватьself
как имя типа int, но неsuper
?
Тот факт, что первое назначение всегда работает (за исключением случаев с YES, NO и NULL), похоже, подтверждает идею о том, что ни один из кандидатов не является технически зарезервированными ключевыми словами, которые не найдены в C. Или?
Может кто-нибудь дать нам авторитетное объяснение этого острого вопроса?
На карту поставлена честь нескольких людей.
РЕДАКТИРОВАТЬ: Как Николай Рюэ указал, нам нужно четкое определение «ключевое слово», чтобы продолжить. Нико процитировал статью в Википедии, в которой говорилось, что ключевое слово - это «слово или идентификатор, имеющий особое значение».
Я думаю, что разумно использовать это определение из той же статьи:
Во многих языках, таких как C и подобных средах, таких как C ++, ключевое слово - это зарезервированное слово, которое идентифицирует синтаксическую форму. Слова, используемые в конструкциях потока управления, такие как if, then и else являются ключевыми словами. В этих языках ключевые слова также не могут использоваться в качестве имен переменных или функций.
Кроме того, как говорится в статье:
Как правило, когда программист пытается использовать ключевое слово для имени переменной или функции, возникает ошибка компиляции.
В этом смысле существуют ли зарезервированные ключевые слова, которыепредопределено в формальных спецификациях языка и не может использоваться в качестве пользовательского имени?