Пространства имен

Компилятор настраивает пространства имен, чтобы различать идентификаторы, используемые для различных типов элементов. Имена в каждом пространстве имен должны быть уникальными во избежание конфликтов, но одинаковые имена могут использоваться в нескольких пространствах имен. Это означает, что можно использовать один и тот же идентификатор для двух или более различных элементов при условии, что элементы расположены в разных пространствах имен. Компилятор может разрешить ссылки на основе синтаксического контекста идентификатора в программе.

Примечание

Не следует путать ограниченную нотацию 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 ссылается на переменную структуры. Однако не рекомендуется перегружать пространство имен тега, поскольку это искажает смысл.

См. также

Структура программы