КЛЮЧЕВЫЕ СЛОВА: auto, extern, static, register

We use cookies. Read the Privacy and Cookie Policy

КЛЮЧЕВЫЕ СЛОВА: auto, extern, static, register

     Одно из достоинств языка Си состоит в том, что он позволяет управлять ключевыми механизмами программы. Классы памяти языка Си - пример такого управления; они дают возможность определить, с какими функциями связаны какие переменные и как долго переменная сохраняется в программе. Классы памяти - первая тема данной главы.

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

КЛАССЫ ПАМЯТИ И ОБЛАСТЬ ДЕЙСТВИЯ

     Мы уже упоминали раньше, что локальные переменные известны только функциям, содержащим их. В языке Си предполагается также, что о глобальных переменных "знают" сразу несколько функций. Предположим, например, что и main( ), и critic( ) имеют доступ к переменной units. Это будет иметь место, если отнести units к "внешнему" классу памяти, как показано ниже:

/* глобальная переменная units */

int units;  /* внешняя переменная */

main( )

{

extern int units;

printf (" Сколько фунтов масла находится в бочонке? ");

scanf (" %d" , &units);

while (units != 56) critic( );

printf(" Вы должны поискать в справочнике ! ");

} critic( )

{

extern int units;

printf (" He повезло, дружок. Попытайся снова. ");

scanf (" %d" , &units);

}

Вот полученный результат:

Сколько фунтов масла находится в бочонке?

14

Не повезло, дружок. Попытайся снова.

56

Вы должны поискать в справочнике!

(Мы сделали это.)

Обратите внимание, что второе значение units было прочитано функцией critic( ), однако main() также "узнала" это новое значение, когда оно вышло из цикла while.

     Мы сделали переменную units внешней, описав ее вне любого определения функции. Далее, внутри функций, использующих эту переменную, мы объявляем ее внешней при помощи ключевого слова extern, предшествующего спецификации типа переменной. Слово extern предлагает компьютеру искать определение этой переменной вне функции. Если бы мы опустили ключевое слово extern в функции critic( ), то компилятор создал бы в функции critic новую переменную и тоже назвал бы ее units. Тогда другая переменная units() [которая находится в main()] никогда не получила бы нового значения.

     Каждая переменная, как мы знаем, имеет тип. Кроме того, каждая переменная принадлежит к некоторому классу памяти. Есть четыре ключевых слова, используемые для описания классов памяти: extern (для внешнего), auto (для автоматического), static и register. До сих пор мы не обращали внимание на классы памяти, так как переменные, описанные внутри функции, считались относящимися к классу auto, если они не описывались иначе (по умолчанию они относились к классу auto).

     Определение класса памяти переменной зависит oт того, где переменная описана и какое ключевое слово (если оно есть) используется.

     Класс памяти позволяет установить два факта. Во-первых, определить, какие функции имеют доступ к переменной. (Пределы, до которых переменная доступна, характеризуют ее "область действия".) Во-вторых, определить, как долго переменная находится в памяти. Теперь перейдем к свойствам каждого типа.