В чем смысл "определителя"?

В чем смысл "определителя" и разницы между "квалификатором" и "ключевым словом"?

Для определителя volatile в C, и мы можем сказать, что volatile является ключевым словом, так в чем смысл "определителя"?

Ответы

Ответ 1

A квалификатор добавляет дополнительное "качество", например, задавая волатильность или константу переменной. Они похожи на прилагательные: "изменчивый человек", "изменчивый инт", "неподкупная леди", "двойник". С или без квалификатора сама переменная все еще занимает один и тот же объем памяти, и каждый бит имеет ту же интерпретацию или вклад в состояние/значение. Квалификаторы просто указывают что-то о том, как он может быть доступен или где он хранится.

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

Примеры

  • volatile и const являются как квалификаторами, так и ключевыми словами
  • if, class, namespace являются ключевыми словами, но не квалификаторами
  • std, main, iostream, x, my_counter - все идентификаторы, но ни ключевые слова, ни квалификаторы

Здесь есть полный список ключевых слов http://www.cppreference.com/wiki/keywords/start. У С++ в настоящее время нет каких-либо квалификаторов, которые не являются ключевыми словами (т.е. Все они "слова", а не некоторые символы пунктуации).


Где отображаются классификаторы относительно информации другого типа?

Быстро отвлекаясь от "того, что означает квалификатор" в синтаксисе использования квалификатора - как комментарии Зайбаса ниже:

... [квалификаторы] определяют только то, что следует [когда] нет ничего предшествующего. поэтому, если вам нужен указатель const для объекта const, вам нужно было написать char * const var...

 


Немного (много?) об идентификаторах

сами идентификаторы - лексические токены (отдельные части исходного кода на С++), которые:

  • начните с символа альфа/буквы или подчеркивания
  • продолжить с 0 или более буквенно-цифровыми символами или символами подчеркивания

Если это помогает, вы можете думать об идентификаторах, как указано в regexp "[A-Za-z _] [A-Za-z_0-9] *". Примерами являются "яйцо", "строка", "__f", "x0", но не "4e4" (буква double), "0x0a" (это шестнадцатеричный литерал), "(f)" (три лексических маркера, средний - идентификатор "f" ).

    Но являются ли идентификаторы ключевых слов?

Для С++ терминология не используется последовательно. В общем использовании вычислений ключевые слова являются подмножеством идентификаторов, а некоторые места/применения в стандарте С++ 11 четко отражают это:

  • "Идентификаторы, указанные в таблице 4, зарезервированы для использования в качестве ключевых слов" (первое предложение в 2.12 Ключевые слова)
  • "Идентификаторы, которые являются ключевыми словами или операторами в С++..." (из 17.6.1.2 примечание 7)

(Существуют альтернативные формы некоторых операторов - not, and, xor, or - хотя досадно Visual С++ отключает их по умолчанию, чтобы не нарушать старый код, который их использовал, но не как операторы.)

Как отмечает Potatoswatter в комментарии, во многих других местах стандарт определяет лексические токены identifier и keyword как взаимоисключающие маркеры в грамматике:

  • "Существует пять видов токенов: идентификаторы, ключевые слова,..." (2,7 токенов)

Также существует краевой регистр, в котором чувствительный контекст определения:

  • Если ключевое слово (2.12) или альтернативный токен (2.6), который удовлетворяет синтаксическим требованиям идентификатора (2.11), содержится в маркере атрибута, он считается идентификатором. (7.6.1 Синтаксис атрибутов и семантика 2)

Идентификаторы без ключевого слова, которые вы по-прежнему не должны использовать

Некоторые идентификаторы, такие как "std" или "string", имеют определенное использование, указанное в стандарте С++, однако они не являются ключевыми словами. Как правило, сам компилятор не обрабатывает их по-разному с вашим собственным кодом, и если вы не включаете заголовки с указанными стандартами, то компилятор, вероятно, даже не знает о стандартном использовании "std" . Возможно, вы сможете создать свою собственную функцию, переменную или тип, называемый "std" . Не очень хорошая идея, хотя... хотя приятно понимать общее разделение между ключевыми словами и стандартной библиотекой, реализации имеют свободу размывания границ, поэтому вы должны просто предполагать, что функции С++ работают при включении соответствующих заголовков, а ваше использование соответствует документации и не делайте ничего, что могло бы конфликтовать.