Разделы

  Java, JavaScript
  Документация Perl
  Новости
  Документация ASP
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C

Внешние переменные и область действия

Язык программирования C
4.8 / 5 (80 оценок)

Переменные в main, такие как line, longest т.п., являются частными или локальными для main. Поскольку они находятся внутри main, никакая другая функция не может иметь непосредственного доступа к ним. То же касается переменных в других функциях; например, переменная i функции getline не имеет никакого отношения к i с copy. Каждая локальная переменная в функции начинает существовать только тогда, когда вызваная функция исчезает, когда функция закончила свое выполнение. Вот почему такие переменные часто называют автоматическими переменными, следуя терминологии других языков. Мы тоже в дальнейшем будем использовать этот термин относительно локальных переменных. (далее обсуждается класс хранения static, в котором локальные переменные содержат свое значение между вызовами функций.)

Как альтернатива автоматическим, можно обозначить переменные, которые будут внешними для всех функций, т.е. переменные, на которые любая функция сможет сослаться по их именам. (Этот механизм похож на сменные COMMON языка Fortran или переменные, объявленные во внешнем блоке в Pascal) Вследствие того, что внешние переменные глобально доступны, их можно использовать вместо списка аргументов для обмена данными между функциями. Более того, благодаря тому, что внешние переменные существуют постоянно, вместо того, чтобы появляться и исчезать с вызовами функций, они сохраняют свое значение даже после того, как функция, которая их установила, завершила свою работу.

Внешнюю переменную надо обозначить только один раз за пределами любой функции; это отведет место для их хранения. Переменную также нужно объявить в каждой функции, которая хочет иметь доступ к ней; этом заявит о типе переменной. Объявление может быть явным утверждением extern или неявным через контекст. Чтобы конкретизировать нашу дискуссию, перепишем программу выявления длинного строки из line, longest и max, как внешние переменные. Это требует изменения вызовов, объявлений и тел всех трех функций.
# Include

# Define MAXLINE 1000 / * максимальная длина строки ввода * /

int max; / * самая найдена длина * /
char line [MAXLINE]; / * текущий введенную строку * /
char longest [MAXLINE]; / * сохраняет длинный строку * /

int getline (void);
void copy (void);

/ * Выводит длинный строка; специальная версия * /
main ()
{
int len;
extern int max;
extern char longest [];

max = 0;
while ((len = getline ())> 0)
if (len> max) {
max = len;
copy ();
}
if (max> 0) / * была введена строка * /
printf ("% s", longest);
return 0;
}

/ * Getline: специальная версия * /
int getline (void)
{
int c, i;
extern char line [];

for (i = 0; i & & (C = getchar))! = EOF & & c! = '\ N'; + + i)
line [i] = c;
if (c == '\ n') {
line [i] = c;
+ + I;
}
line [i] = '\ 0';
return i;
}
/ * Copy: специальная версия * /
void copy (void)
{
int i;
extern char line [] longest [];

i = 0;
while ((longest [i] = line [i])! = '\ 0')
+ + I;
}

Внешние переменные в main, getline и copy обозначено в первых строках в примере выше, что указывает на их тип и отводит место для хранения. Синтаксически, внешние определения похожие на определение локальных переменных, но поскольку это происходит за пределами функций, переменные становятся внешними. Перед тем, как некая функция может пользоваться внешней переменной, название переменной должна стать известной функции; объявления будут таким же как до сих пор, за исключением добавленного слова extern.

В некоторых случаях, объявления extern можно опустить. Если определение внешней переменной происходит в файле перед ее использованием в какой функции, тогда отпадает необходимость в объявлении extern внутри функции. Таким образом, объявление extern в main, getline и copy излишни. В действительности, общей практикой является размещение всех определений внешних переменных начале исходного файла, избегая таким образом объявлений extern.

Если программа размещена в нескольких исходных файлах, и какую переменную, указанную в файли1, были использованы в файли2 и файли3, тогда объявления extern - обязательные в файли2 и файли3 для сочетания использований переменной. Обычной практикой является собрать все объявления extern переменных и функций в отдельный файл, исторически назван файлом заголовка, поскольку он включен директивой # include в заголовок каждого исходного файла. Традиционным суффиксом имен файлов заголовка есть. H. Функции стандартной библиотеки, например, объявлен в файле заголовка вроде .

Так как специализированные версии getline и copy не имеют аргументов, логика подсказывает, что их прототипы начале файла должны выглядеть как getline () и copy (). Но ради совместимости со старшими C-программами, стандарт рассматривает пустой список аргументов, как объявление старого стиля и выключает любую проверку списка аргументов; надо использовать слово void для откровенно пустого списка аргументов.

Вы, наверное, заметили, что в этой статье мы осторожно используем слова "определение" и "объявления", когда мы ссылаемся на внешние переменные. "Определение" касается того места, где переменную созданы или назначено место для хранения; "объявление" употребляется для тех мест, где высказано сущность переменной, но не отведено места для ее хранения.

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

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


Другие материалы по теме:

- Функции и структура программ
- Язык программирования c в игровой индустрии: движки и производительность
- Символьные массивы
- Внешние переменные и область действия
- Введение в c++


📌 smti.ru © 2026 SMTI.RU: инструменты, знания и сообщество для создания веб-проектов | Обратная связь