int errupt; /* Три переменные, описанные вне функции */
char coal;
double up;
main( )
{
extern int errupt; /* объявлено, что 3 переменные */
extern char coal; /* являются внешними */
extern double up;
Группу extern-описаний можно совсем опустить, если исходные определения переменных появляются в том же файле и перед функцией, которая их использует. Включение ключевого слова externпозволяет функции использовать внешнюю переменную, даже если она определяется позже в этом или другом файле. (Оба файла, конечно, должны быть скомпилированы, связаны или собраны в одно и то же время.)
Если слово extern не включено в описание внутри функции, то под этим именем создается новая автоматическая переменная. Вы можете пометить вторую переменную как "автоматическую" с помощью слова auto и тем самым показать, что это ваше намерение, а не оплошность. Три примера демонстрируют четыре возможных комбинация описаний:
/* Пример1 */
int hocus;
main( ) {
extern int hocus; /* hocus описана внешней */
...
}
magic( ) {
extern int hocus;
...
}
Здесь есть одна внешняя переменная hocus, и она известна обеим функциям main( )и magic( ).
/* Пример2 */
int hocus ;
main( )
{
extern int hocus; /* hocus описана внешней */
...
}
magic( )
{
/* hocus не описана совсем */
...
}
Снова есть одна внешняя переменная hocus, известная обеим функциям. На этот раз она известна функцииmagic( ) по умолчанию.
/* Пример3 */
int hocus;
main( )
{
int hocus; /* hocus описана и
является автоматической по умолчанию */
...
}
magic( )
{
auto int hocus; /* hocus описана автоматической */
...
}
В этом примере созданы три разные переменные с одинаковым именем. Переменная hocusв функции main( )является автоматической по умолчанию и локальной для main( ), в функции magic( )она явно описана автоматической и известна только для magic( ). Внешняя переменная hocusнеизвестна ни main( ), ни magic( ), но обычно известна любой другой функции в файле, которая не имеет своей собственной локальной переменной hocus.
Эти примеры иллюстрируют область действия внешних переменных. Они существуют, пока работает программа, и так как эти переменные доступны любой функции, они не исчезнут, если какая-нибудь одна функция закончит свою работу.
Название раздела не следует понимать буквально, т. е. считать, что такие переменные не могут изменяться. В действительности слово "статические" здесь означает, что переменные остаются в работе. Они имеют такую же область действия, как автоматические переменные, но они не исчезают, когда содержащая их функция закончит свою работу. Компилятор хранит их значения от одного вызова функции до другого. Следующий пример иллюстрирует это и показывает, как описать статическую переменную.
/* статическая переменная */
main( )
{
int count;
for (count = 1; count <= 3; count++)
{
printf(" Итерация %d:\n", count);
trystat( );
}
}
trystat( )
{
int fade = 1;
static int stay; = 1;
printf("fade = %d и stay = %d\n", fade++, stay++);
}
Заметим, что функция trystat( )увеличивает каждую переменную после печати ее значения. Работа этой программы даст следующие результаты:
Итерация 1:
fade = 1 и staly = 1
Итерация 2:
fade = 1 и stay = 2
Итерация 3:
fade = 1 и stay = 3
Статическая переменная stay"помнит", что ее значение было увеличено на 1, в то время как для переменной fadeначальное значение устанавливается каждый раз заново. Это указывает на разницу в инициализации: fadeинициализируется каждый раз, когда вызывается trystat( ), в то время как stayинициализируется только один раз при компиляции функции trystat( ).
Внешние статические переменные
Вы можете также описать статическиепеременные вне любой функции. Это создаст "внешнюю статическую"переменную. Разница между внешней переменной и внешней статической переменной заключается в области их действия. Обычная внешняя переменная может использоваться функциями в любом файле, в то время как внешняя статическая переменная может использоваться только функциями того же самого файла, причем после определения переменной. Вы описываете внешнюю статическую переменную, располагая ее определение вне любой функции.
Читать дальше