Определение переменной static Глобальное Блок
  Определение переменной auto или register Локальное Блок
  Объявление функции extern или static Локальное Остаток исходного файла

Следующий пример программы иллюстрирует понятия блочной структуры, времени жизни и области действия переменных.

/* i определяется на внешнем уровне */

int i = 1;

/* функция main определяется на внешнем уровне */

main()

{

/* печатается 1 (значение переменной i внешнего уровня) */

printf('%d ', i);

/* первый вложенный блок */

{

/* i переопределяется */

int i = 2, j = 3;

/* печатается 2, 3 */

printf('%d %d ', i, j);

/* второй вложенный блок */

{

/* i переопределяется */

int i = 0;

/* печатается 0, 3 */

printf('%d %d , i, j);

/* конец второго вложенного блока */

}

/* печатается 2 (восстановлено определение i в охватывающем блоке) */

printf('%d ', i);

/* конец первого вложенного блока */

}

печатается 1 (восстановлено определение внешнего уровня)*/

printf('%d ', i);

/* конец определения функции main */

}

В этом примере показано четыре уровня области действия: самый внешний уровень и три уровня, образованных блоками. Функция printf определена в библиотеке стандартных функций (см. раздел 12). Функция main печатает значения 1, 2, 3, 0,3,2,1.

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

В программе на языке Си имена (идентификаторы) используются для ссылок на различного рода объекты — функции, переменные, формальные параметры и т. п. При соблюдении определенных правил, описанных в данном разделе, допускается использование одного и того же идентификатора для более чем одного программного объекта.

Чтобы различать идентификаторы объектов различного рода, компилятор языка Си устанавливает так называемые 'пространства имен'. Во избежание противоречий имена внутри одного пространства должны быть уникальными, однако в различных пространствах могут содержаться идентичные имена. Это означает, что можно использовать один и тот же идентификатор для двух или более различных объектов, если имена объектов принадлежат к различным пространствам. Однозначное разрешение вопроса о том, на какой объект ссылается идентификатор, компилятор языка Си осуществляет по контексту появления данного идентификатора в программе. Ниже перечисляются виды объектов, которые можно именовать в программе на языке Си, и соответствующие им четыре пространства имен.

Таблица 2.2.

Объекты Пространство имен
Переменные, функции, формальные параметры, элементы списка перечисления, typedef Уникальность имен в пределах этого пространства тесно связана с понятием области действия. Это выражается в том, что в данном пространстве могут содержаться совпадающие идентификаторы, если области действия именуемых ими объектов не пересекаются. Другими словами, совпадение идентификаторов возможно только при локальном переобъявлении (см. раздел 2.4). Обратите внимание на то, что имена формальных параметров функции сгруппированы в одном пространстве с именами локальных переменных. Поэтому переобъявление формальных параметров внутри любого из блоков функции недопустимо, typedef — это объявления имен типов (см. раздел 3.8.2).
Теги Теги всех переменных перечислимого типа, структур и объединений (см. разделы 3.4.2 — 3.4.4) сгруппированы в одном пространстве имен. Каждый тег переменной перечислимого типа, структуры или объединения должен быть отличен от других тегов с той же самой областью действия. Ни с какими другими именами имена тегов не конфликтуют.
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату
×