На вчерашней встрече CocoaHeads в Оресунде Пейлоу создал отличную викторину по ObjC. Конкуренция была интенсивной, и три человека остались с одинаковыми баллами, когда нужно было оценить последний вопрос: сколько зарезервированных ключевых слов добавляет Objective-C к C?
Последовали оживленные дебаты. Все согласились с тем, что @interface
, @implementation
и т. Д. Являются директивами препроцессора, а не ключевыми словами, но как насчет чего-то вроде in
? Это может быть ключевое слово, но это не зарезервированное ключевое слово. Например, следующее будет компилироваться без ошибок или предупреждений:
NSArray* in;
for (in in in)
NSLog(@"bwahahaa");
Мы пришли к выводу, что ObjC добавляет нет зарезервированных ключевых слов к C, и кто-то выиграл, казалось бы, хорошо заработанную книгу.
Но сегодня я попытался систематически злоупотребить компилятором, попробовав такие вещи:
int self = 45;
self++;
int y = self;
Это прекрасно компилируется, и тот же код работает, заменяя 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, являются ключевыми словами. В этих языках ключевые слова нельзя также использовать в качестве имен переменных или функций.
Кроме того, как говорится в статье:
Обычно, когда программист пытается использовать ключевое слово для имени переменной или функции, возникает ошибка компиляции.
В этом смысле существуют ли какие-либо зарезервированные ключевые слова, которые предопределены в формальных спецификациях языка и не могут использоваться в качестве пользовательское имя?