Внешние ссылки

 

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

Функции по умолчанию глобально видимы, то есть доступны в любых модулях. Однако, как и переменная, функция с предшествующим спецификатором static имеет областью действия только тот модуль, в котором определена.

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

Пример. Рассмотрим программу, текст которой размещен в двух файлах. Для связи функций программы используется глобальная переменная.

Файл TEST1.C:

 

#include<stdio.h>

int i=3; / * описание глобальной переменной * /

static void next( ); /* прототип статической функции */

void main ( ) /* главная функция */

{ i++ ; /* изменение глобальной переменной */

printf (“B функции main i=%d\n”, i);

next ( ); /* вызов “своей” функции */

}

static next ( ) /* функция данного модуля */

{ i++ ; /* изменение глобальной переменной */

printf (“ B функции next i=%d\n”, i);

other ( ); /* вызов функции другого модуля */

}

 

Файл TEST2.C:

 

#include<stdio.h>

extern int i; /* ссылка на внешнюю переменную */

void other ( ) /* функция глобально видима */

{ i++ ; /* изменение глобальной переменной */

printf (“ B функции other i=%d\n”, i);

}

 

Файл текста программы TESTPROJ.PRJ:

 

TEST1.C

TEST2.C

 

Результаты программы:

B функции main i=4

B функции next i=5

B функции other i=6

 

Пример. Для решения задачи, в которой осуществляется обмен данными между двумя переменными и определяется максимум из двух переменных, создать исходные текстовые файлы:

1) функции обмена значениями двух переменных Obmen( ) и

функции нахождения максимума из двух чисел Max2 ( );

2) главной функции, использующей предыдущие функции;

3) проект программы.

Файл главной функции OBMEMAIN.C:

 

#include <conio.h>

void main() /* главная функция */

{ int a, b; /* рабочие переменные */

clrscr ( ); /* очистка экрана */

printf (“Работа программы: \n”);

printf (“Ввести 2 числа: ”);

scanf (“%d%d”, &a, &b); /* ввод чисел */

printf (“До обмена: a=%d b=%d\n”, a, b);

Obmen (&a, &b); /* вызов функции из файла OBMENMAX.C */

printf (“После обмена: a=%d b=%d\n”, a, b);

printf (“Максимум=%d\n”, Max2(a,b)); /* вызов функции из файла

OBMENMAX.C */

printf (“Нажмите любую клавишу…”);

getch ( ); /* задержка экрана результатов */

}

 

Файл функций OBMENMAX.C:

 

void Obmen (int*x, int*y) /* функция обмена данными двух переменных*/

{ int r;

r = *x; *x = *y; *y = r;/* обмен данными через указатели */

}

 

int Max2 (int x, int y) /* функция поиска максимума из двух чисел */

{ if (x>y) return (x);

else return (y);

}

 

Файл проекта OBMEN.PRJ:

 

OBMEMAIN.C

OBMENMAX.C

 

Результаты программы:

Ввести 2 числа: 5 7

До обмена: а=5 b=7

После обмена: a=7 b=5

Максимум=7

Нажмите любую клавишу…