Зарезервированные ключевые слова в 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 являются ключевыми словами. В этих языках ключевые слова также не могут использоваться в качестве имен переменных или функций.

Кроме того, как говорится в статье:

Как правило, когда программист пытается использовать ключевое слово для имени переменной или функции, возникает ошибка компиляции.

В этом смысле существуют ли зарезервированные ключевые слова, которыепредопределено в формальных спецификациях языка и не может использоваться в качестве пользовательского имени?

Ответы на вопрос(6)

Ваш ответ на вопрос