Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Зарезервированные ключевые слова в Objective-C?

Автор вопроса: FelixyzОтветов: 6

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

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

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

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

  • Некоторые связанные материалы здесь: stackoverflow.com/questions/25749/ Felixyz 19.12.2009

gccobjective-ckeywordcompiler-constructiongrammar

Ответы

Ответ 1 · рейтинг 10 · NSResponder

Все согласились с тем, что @interface, @implementation и т. д. являются директивами препроцессора, а не ключевыми словами

Тогда все ошибались. #import и #pragma - директивы препроцессора. @interface, @implementation, @protocol и т. Д. Являются ключевыми словами Objective-C и являются директивами компилятора. Они не были директивами препроцессора с тех пор, как NeXT расширил GCC для компиляции Objective-C без оригинальной реализации препроцессора Objective-C Stepstone.

Ответ 2 · рейтинг 4 · jon hohle

Re: Николай Рухе предполагает, что "я" - это ключевое слово

self является параметром метода Objective-C типа id (аналогично тому, как _cmd также является параметром типа SEL), а не ключевым словом. nil - это макрос, который расширяется до NULL. Я немного разочарован тем, что super не расширяется до макроса и не является параметром.

Из записи в Википедии:

Objective-C is a thin layer on top of C, and moreover is a strict superset of C. It is possible to compile any C program with an Objective-C compiler, and to freely include C code within an Objective-C class.

Это помешало бы Objective-C добавлять в язык какие-либо запрещенные ключевые слова.

Ответ 3 · рейтинг 2 · nes1983

Википедия определяет ключевые слова как:

В компьютерном программировании ключевое слово - это слово или идентификатор, имеющий особое значение для языка программирования.

Я бы перевел это так: ключевое слово в языке не является терминальным по своей грамматике. (Между прочим, грамматика не содержит слово "ключевое слово" само по себе, так что здесь нет путаницы).

Терминалы в грамматике будут:

  • пустота
  • символ
  • короткая
  • int
  • длинная
  • плавать
  • двойной
  • подписанный
  • беззнаковый
  • id
  • const
  • летучий
  • in
  • вне
  • inout
  • ксерокопия
  • byref
  • в одну сторону
  • себя
  • супер
  • @интерфейс
  • @конец
  • @выполнение
  • @конец
  • @интерфейс
  • @конец
  • @выполнение
  • @конец
  • @protoco
  • @конец
  • @класс

Ответ 4 · рейтинг 2 · Kornel

Грамматика в приложении B оригинальной книги 1995 года определяет super как терминал "буквального символа", и это особый случай синтаксиса получателя сообщения.

in литеральный символ является частью спецификатора протокола в ObjC 1.0 и повторно использовался в синтаксисе быстрого перечисления в ObjC 2.0 (который не имеет формального определения грамматики AFAIK).

id определяется как часть спецификатора типа вместе с void, char, unsigned, типами и т. Д. Если вы вызываете void ключевое слово, то id тоже.

Ответ 5 · рейтинг 1 · Laurent Etiemble

Взгляните на Язык программирования Objective-C дает вам некоторые подсказки о том, что возможно, а что нет. Поскольку некоторые "ключевые слова" определены в файле заголовка, их замена может привести к наблюдаемому (и неожиданному) поведению.

Ответ 6 · рейтинг 1 · Kristopher Johnson

Вы можете проверить Язык программирования Objective-C.

Насколько я могу судить, в этом документе ничего не классифицируется как "зарезервированное слово". @implementation, @interface и т. Д. Называются "директивами компилятора".

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы