На вчерашней встрече 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;
Это компилируется отлично, и тот же код работает, заменяя 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. Или?
Может кто-нибудь, пожалуйста, дайте нам убедительное объяснение этой тернистой проблемы?
На карту поставлено несколько людей.
EDIT: Как отметил Николай Рух, нам нужно четкое определение "ключевое слово" для продолжения. Нико привел статью в Википедии, в которой говорится, что ключевым словом является "слово или идентификатор, который имеет конкретное значение".
Я думаю, что разумно использовать это определение из той же статьи:
На многих языках, таких как C и аналогичные среды, такие как С++, ключевое слово - это зарезервированное слово, которое идентифицирует синтаксическую форму. слова используемых в конструкциях управляющего потока, таких как как будто, тогда, а также ключевые слова. В эти языки, ключевые слова также не могут использоваться как имена переменных или функции.
Кроме того, как говорится в статье:
Обычно, когда программист пытается использовать ключевое слово для переменной или имя функции, ошибка компиляции будет срабатывать.
В этом смысле есть ли зарезервированные ключевые слова предопределенные в официальных форматах языков и не могут использоваться как определяемые пользователем имена?