Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
#include
int units = 0; /* переменная с областью видимости в пределах файла */
void critic(void); int main(void)
{
}
void critic(void)
{
}
Здесь переменная units имеет область видимости в пределах файла и может применяться и в main(), и в critic() .(Точнее, units имеет область видимости в пределах файла и внешнее связывание; отличие мы раскроем в следующем разделе.) Поскольку переменные с областью видимости в пределах файла могут использоваться в более чем одной функции, они еще называются глобальными переменными.
НА ЗАМЕТКУ! Единицы и файлы трансляции
То, что вы видите как несколько файлов, для компилятора может выглядеть как единственный файл. Предположим для примера, и это случается довольно часто, что вы включаете один или больше заголовочных файлов (с расширением.h) в файл исходного кода (с расширением .с). В свою очередь, заголовочный файл может включать другие заголовочные файлы. В итоге могут быть задействованы многие физические файлы. Однако предпроцессор С по существу заменяет директиву #include содержимым заголовочного файла. Таким образом, компилятор видит единственный файл, содержащий информацию из вашего файла исходного кода и всех заголовочных файлов. Такой файл называется единицей трансляции. Когда мы описываем переменную как имеющую область видимости в пределах файла, на самом деле она будет видимой целой единице трансляции. Если ваша программа состоит из нескольких файлов исходного кода, тогда она будет насчитывать и несколько единиц трансляции, каждая из которых соответствует файлу исходного кода и включаемым в него файлам.
Связывание
Давайте поговорим о связывании. Переменная в С имеет одно из следующих связываний: внешнее связывание, внутреннее связывание или отсутствие связывания. Переменные с областью видимости в пределах блока, функции или прототипа функции не имеют связывания. Это означает, что они являются закрытыми для блока, функции или прототипа, в котором определены. Переменная с областью видимости в пределах файла может иметь либо внутреннее, либо внешнее связывание. Переменная
484 глава 12 с внешним связыванием может применяться в любом месте многофайловой программы, а переменная с внутренним связыванием — где угодно в единице трансляции.
НА ЗАМЕТКУ! Формальные и неформальные термины
В стандарте С для описания области видимости, ограниченной одной единицей трансляции (файл исходного кода плюс его включаемые заголовочные файлы), используется формулировка “область видимости в пределах файла с внутренним связыванием", а для описания области видимости, которая (во всяком случае, потенциально) распространяется на другие единицы трансляции — формулировка “область видимости в пределах файла с внешним связыванием". Но у программистов не всегда есть время и терпение применять такие тер. мины. Распространение получили сокращения “область видимости в пределах файла” для “области видимости в пределах файла с внутренним связыванием" и “глобальная область видимости" или “область видимости в пределах программы” для “области видимости в пределах файла с внешним связыванием".
Как же тогда выяснить, внутреннее или внешнее связывание имеет переменная с областью видимости в пределах файла? Вы должны посмотреть, используется ли во внешнем определении спецификатор класса хранения static:
int giants = 5; // область видимости в пределах файла,
// внешнее связывание
static int dodgers =3; // область видимости в пределах файла,
// внутреннее связывание
int main()
{
}
Переменная giants может применяться в других файлах, которые представляют собой составные части той же самой программы. Переменная dodgers является закрытой для данного конкретного файла, но может использоваться любой функцией в этом файле.
продолжительность хранения
Область видимости и связывание описывают видимость идентификаторов. Продолжительность хранения характеризует постоянство объектов, доступных через эти идентификаторы. Объект в С имеет одну из следующих четырех продолжительностей хранения: статическую, потоковую, автоматическую или выделенную.
Если объект имеет статическую продолжительность хранения, он существует на протяжении времени выполнения программы. Переменные с областью видимости в пределах файла имеют статическую продолжительность хранения. Обратите внимание, что для переменных с областью видимости в пределах файла ключевое слово static указывает тип связывания, а не продолжительность хранения. Переменная с областью видимости в пределах файла, объявленная с применением static, имеет внутреннее связывание, но все переменные с областью видимости в пределах файла, имеющие внугреннее или внешнее связывание, обладают статической продолжительностью хранения.
Потоковая продолжительность хранения вступает в игру при параллельном программировании, когда выполнение программы может быть разделено на несколько потоков. Объект с потоковой продолжительностью хранения существует с момента его объявления и до завершения потока. Такой объект создается, когда объявление, которое иначе привело бы к созданию объекта с областью видимости в пределах файла,
Классы хранения, связывание и управление памятью 485
модифицировано с помощью ключевого слова _Thread_local. Когда переменная объявлена с таким спецификатором, каждый поток получает собственную закрытую копию этой переменной.
Переменные с областью видимости в пределах блока обычно имеют автоматическую продолжительность хранения. Память для этих переменных выделяется, когда поток управления входит в блок, где они определены, и освобождается, когда поток управления покидает этот блок. Идея заключается в том, что память, используемая для автоматических переменных, является рабочим пространством или временной памятью, которая может применяться многократно. Например, после завершения вызова функции память, которую функция использовала для своих переменных, может быть задействована при вызове следующей функции.
Массивы переменной длины демонстрируют небольшое исключение в том, что они существуют от места своего объявления и до конца блока, а не от начала блока и до его конца.
Локальные переменные, которые мы применяли до сих пор, попадают в категорию автоматической продолжительности хранения. Например, в следующем коде переменные number и index появляются каждый раз, когда функция bore() вызывается, и исчезают после ее завершения:
void bore(int number)
{
int index;
for (index = 0; index < number; index++) puts("Выполнение привычной работы.\n");
return 0;
}
Тем не менее, переменная может иметь область видимости в пределах блока, но статическую продолжительность хранения. Чтобы создать такую переменную, объявите ее внутри блока и добавьте в объявление ключевое слово static:
Читать дальшеИнтервал:
Закладка: