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