Пространства имен
Компилятор настраивает пространства имен, чтобы различать идентификаторы, используемые для различных типов элементов. Имена в каждом пространстве имен должны быть уникальными во избежание конфликтов, но одинаковые имена могут использоваться в нескольких пространствах имен. Это означает, что можно использовать один и тот же идентификатор для двух или более различных элементов при условии, что элементы расположены в разных пространствах имен. Компилятор может разрешить ссылки на основе синтаксического контекста идентификатора в программе.
Примечание.
Не следует путать ограниченную нотацию C пространства имен с возможностью пространства имен C++. Дополнительные сведения см. в разделе Пространства имен (C++) в справочнике по языку C++.
Ниже приводится список пространств имен, используемых в C.
Метки инструкций
Именованные метки операторов являются частью операторов. За определениями меток операторов всегда следует двоеточие, но определения не являются частью меток case
. Метки операторов всегда используются сразу за ключевым словом goto
. Метки операторов не должны отличаться от других имен или имен меток в других функциях.
Теги структуры, объединения и перечисления
Эти теги являются частью описателей типов структуры, объединения и перечисления, и, если они присутствуют, всегда следует за зарезервированными словами struct
union
илиenum
. Имена тегов должны отличаться от всех других тегов структур, перечислений или объединений с такой же видимостью.
Члены структур или профсоюзов
Имена членов выделены в пространствах имен, связанных с каждыми типом структуры и объединения. То есть один и тот же идентификатор может быть именем компонента в любом количестве структур или объединений одновременно. Определения имен компонентов всегда находятся в описателях типа структуры или объединения. Имена компонентов всегда следуют сразу за операторами выбора члена (-> и .). Имя члена должно быть уникальным в пределах структуры или объединения, но оно не обязательно должно отличаться от других имен в программе, включая имена членов различных структур и объединений или имя самой структуры.
Обычные идентификаторы
Все другие имена находятся в пространстве имен, которое содержит переменные, функции (включая формальные параметры и локальные переменные) и константы перечисления. Имена идентификаторов имеют вложенную видимость, поэтому их можно переопределять в блоках.
Имена typedef
Имена typedef невозможно использовать в качестве идентификаторов в одной и той же области.
Например, поскольку теги структуры, члены структуры и имена переменных находятся в трех разных пространствах имен, три элемента с именем student
в этом примере не конфликтуют. Контекст каждого элемента позволяет правильно интерпретировать каждое вхождение student
в программе. (Дополнительные сведения о структурах см. в разделе Объявления структур.)
struct student {
char student[20];
int class;
int id;
} student;
Если student
отображается после ключевого слова struct
, компилятор распознает его как тег структуры. Если student
отображается после оператора выбора члена (-> или .), имя ссылается на элемент структуры. В других контекстах student
ссылается на переменную структуры. Однако не рекомендуется перегружать пространство имен тега, поскольку это искажает смысл.