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