Язык программирования Си для персонального компьютера | страница 22
В таблице 2.1 показана взаимосвязь основных факторов, которые определяют время жизни и область действия функций и переменных. При обсуждении области действия переменных мы использовали термин "объявление"; в таблице 2.1 конкретизировано для каждого случая, идет ли речь об объявлении или определении. Область действия функций в таблице 2.1 показана под углом зрения операции получения адреса, а не операции вызова функции. Более подробная информация о влиянии спецификаций класса памяти на область действия объекта приведена в разделе 3.6 "Классы памяти".
Таблица 2.1.
Уровень | Объект | Спецификация класса памяти | Время жизни | Область действия |
Внешний | Определение переменной | static | Глобальное | Остаток исходного файла |
Объявление переменной | extern | Глобальное | Остаток исходного файла | |
Объявление или определение функции | static или extern | Глобальное | Остаток исходного файла | |
Внутренний | Объявление переменной | extern | Глобальное | Блок |
Определение переменной | static | Глобальное | Блок | |
Определение переменной | auto или register | Локальное | Блок | |
Объявление функции | extern или static | Локальное | Остаток исходного файла |
Следующий пример программы иллюстрирует понятия блочной структуры, времени жизни и области действия переменных.
/* i определяется на внешнем уровне */
int i = 1;
/* функция main определяется на внешнем уровне */
main()
{
/* печатается 1 (значение переменной i внешнего уровня) */
printf("%d\n", i);
/* первый вложенный блок */
{
/* i переопределяется */
int i = 2, j = 3;
/* печатается 2, 3 */
printf("%d\n%d\n", i, j);
/* второй вложенный блок */
{
/* i переопределяется */
int i = 0;
/* печатается 0, 3 */
printf("%d\n%d\n, i, j);
/* конец второго вложенного блока */
}
/* печатается 2 (восстановлено определение i в охватывающем блоке) */
printf("%d\n", i);
/* конец первого вложенного блока */
}
печатается 1 (восстановлено определение внешнего уровня)*/
printf("%d\n", i);
/* конец определения функции main */
}
В этом примере показано четыре уровня области действия: самый внешний уровень и три уровня, образованных блоками. Функция printf определена в библиотеке стандартных функций (см. раздел 12). Функция main печатает значения 1, 2, 3, 0,3,2,1.
Пространства имен
В программе на языке Си имена (идентификаторы) используются для ссылок на различного рода объекты — функции, переменные, формальные параметры и т. п. При соблюдении определенных правил, описанных в данном разделе, допускается использование одного и того же идентификатора для более чем одного программного объекта.