Зарезервированные ключевые слова в 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;
Это компилируется отлично, и тот же код работает, заменяя 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 и аналогичные среды, такие как С++, ключевое слово - это зарезервированное слово, которое идентифицирует синтаксическую форму. слова используемых в конструкциях управляющего потока, таких как как будто, тогда, а также ключевые слова. В эти языки, ключевые слова также не могут использоваться как имена переменных или функции.
Кроме того, как говорится в статье:
Обычно, когда программист пытается использовать ключевое слово для переменной или имя функции, ошибка компиляции будет срабатывать.
В этом смысле есть ли зарезервированные ключевые слова предопределенные в официальных форматах языков и не могут использоваться как определяемые пользователем имена?
Ответы
Ответ 1
Все согласились, что @interface, @implementation и т.д. - все предпроцессорные директивы, а не ключевые слова
Тогда все ошиблись. #import
и #pragma
являются препроцессорными директивами.
@interface, @implementation, @protocol
и т.д. являются ключевыми словами Objective-C, и они являются директивами компилятора. Они не были предпроцессорными директивами, так как NeXT расширил GCC, чтобы скомпилировать Objective-C без первоначальной реализации оригинальной версии Objective-C.
Ответ 2
Re: Николай Рухе предполагает, что я - ключевое слово
self
является параметром метода Objective-C типа id
(аналогично тому, как _cmd
также является параметром типа SEL
), а не ключевым словом. nil
- макрос, который расширяется до NULL
. Я немного разочарован тем, что super
не распространяется на макрос и не является параметром.
Из записи wikipedia:
Objective-C - это тонкий слой поверх C и, кроме того, является строгим надмножеством C. Можно скомпилировать любую программу C с помощью компилятора Objective-C и свободно включать код C в Objective-C класс.
Это помешало бы Objective-C добавить к языку ограниченные ключевые слова.
Ответ 3
Грамматика в Приложение B исходной книги 1995 года определяет super
как "буквальный символ", и это особый случай в сообщении синтаксиса приемника.
in
Литеральный символ является частью квалификатора протокола в ObjC 1.0 и повторно использовался в синтаксисе быстрого перечисления в ObjC 2.0 (который не имеет формального определения грамматики AFAIK).
id
определяется как часть спецификатора типа рядом с void
, char
, unsigned
, typedefed types и т.д. Если вы вызываете void
ключевое слово, то id
тоже.
Ответ 4
Посмотрите на Objective-C Язык программирования дает некоторые подсказки о том, что возможно или нет. Поскольку некоторые "ключевые слова" определены в файле заголовка, их замещение может привести к наблюдаемому (и неожиданному) поведению.
Ответ 5
Wikipedia определяет ключевые слова как:
В компьютерном программировании ключевым словом является слово или идентификатор, который имеет особое значение для языка программирования.
Я бы перевел это так: ключевое слово на языке не является терминалом в его грамматике. (Btw, грамматика не содержит слова "ключевое слово" только сама по себе, поэтому нет путаницы там).
Клеммы в grammar:
- недействительным
- char
- короткий
- ИНТ
- длинный
- поплавок
- двойной
- подписан
- без знака
- ID
- Const
- летучий
- в
- из
- INOUT
- bycopy
- ByRef
- односторонняя
- самостоятельно
- супер
- @interface
- @end
- @implementation
- @end
- @interface
- @end
- @implementation
- @end
- @protoco
- @end
- @class
Ответ 6
Вы можете проверить Objective-C Язык программирования.
Насколько я могу судить, этот документ не классифицирует ничего как "зарезервированное слово". @implementation
, @interface
и т.д. Называются "директивами компилятора".