В чем смысл "определителя" и разницы между "квалификатором" и "ключевым словом"?
Для определителя volatile
в C, и мы можем сказать, что volatile
является ключевым словом, так в чем смысл "определителя"?
В чем смысл "определителя" и разницы между "квалификатором" и "ключевым словом"?
Для определителя volatile
в C, и мы можем сказать, что volatile
является ключевым словом, так в чем смысл "определителя"?
A квалификатор добавляет дополнительное "качество", например, задавая волатильность или константу переменной. Они похожи на прилагательные: "изменчивый человек", "изменчивый инт", "неподкупная леди", "двойник". С или без квалификатора сама переменная все еще занимает один и тот же объем памяти, и каждый бит имеет ту же интерпретацию или вклад в состояние/значение. Квалификаторы просто указывают что-то о том, как он может быть доступен или где он хранится.
ключевые слова являются предопределенными зарезервированными идентификаторами (возможно, см. ниже), что сам язык присваивает какой-то смысл, вместо того, чтобы освобождать вас для использования в ваших собственных целях (т.е. называть ваши переменные, типы, пространства имен, функции...).
volatile
и const
являются как квалификаторами, так и ключевыми словамиif
, class
, namespace
являются ключевыми словами, но не квалификаторамиstd
, main
, iostream
, x
, my_counter
- все идентификаторы, но ни ключевые слова, ни квалификаторыЗдесь есть полный список ключевых слов http://www.cppreference.com/wiki/keywords/start. У С++ в настоящее время нет каких-либо квалификаторов, которые не являются ключевыми словами (т.е. Все они "слова", а не некоторые символы пунктуации).
Быстро отвлекаясь от "того, что означает квалификатор" в синтаксисе использования квалификатора - как комментарии Зайбаса ниже:
... [квалификаторы] определяют только то, что следует [когда] нет ничего предшествующего. поэтому, если вам нужен указатель
const
для объектаconst
, вам нужно было написатьchar * const var
...
сами идентификаторы - лексические токены (отдельные части исходного кода на С++), которые:
Если это помогает, вы можете думать об идентификаторах, как указано в regexp "[A-Za-z _] [A-Za-z_0-9] *". Примерами являются "яйцо", "строка", "__f", "x0", но не "4e4" (буква double
), "0x0a" (это шестнадцатеричный литерал), "(f)" (три лексических маркера, средний - идентификатор "f" ).
Но являются ли идентификаторы ключевых слов?
Для С++ терминология не используется последовательно. В общем использовании вычислений ключевые слова являются подмножеством идентификаторов, а некоторые места/применения в стандарте С++ 11 четко отражают это:
(Существуют альтернативные формы некоторых операторов - not
, and
, xor
, or
- хотя досадно Visual С++ отключает их по умолчанию, чтобы не нарушать старый код, который их использовал, но не как операторы.)
Как отмечает Potatoswatter в комментарии, во многих других местах стандарт определяет лексические токены identifier
и keyword
как взаимоисключающие маркеры в грамматике:
Также существует краевой регистр, в котором чувствительный контекст определения:
Некоторые идентификаторы, такие как "std" или "string", имеют определенное использование, указанное в стандарте С++, однако они не являются ключевыми словами. Как правило, сам компилятор не обрабатывает их по-разному с вашим собственным кодом, и если вы не включаете заголовки с указанными стандартами, то компилятор, вероятно, даже не знает о стандартном использовании "std" . Возможно, вы сможете создать свою собственную функцию, переменную или тип, называемый "std" . Не очень хорошая идея, хотя... хотя приятно понимать общее разделение между ключевыми словами и стандартной библиотекой, реализации имеют свободу размывания границ, поэтому вы должны просто предполагать, что функции С++ работают при включении соответствующих заголовков, а ваше использование соответствует документации и не делайте ничего, что могло бы конфликтовать.