Доступ к функциям в многомодульной программе

Автоматические переменные

Регистровая переменная

Внутренняя статическая переменная

Локальные переменные

Статистические внешние переменные - static

Область видимости ограничена одним модулем. Доступны всем функциям в одном модуле. Время жизни работа всей программы. Инициализируются по умолчанию 0 на стадии компиляции. Создаются в области данных программы.

 

static int num;

void main (void){

int count;

for (count=1; count<5; count ++){

printf ("%d\n", count);

fun ();

}

}

void fun (void){

int i=1;

num ++;

printf ("%d %d\n", i, num);

}

 

 

Ключевое слово static. Объявляется и определяется внутри одной функции, блока. Инициализируют 0 на стадии компиляции. Создаётся в области данных. Время жизни - работа всей программы, но область видимости только эта функция. При многократном вызове сохраняет своё значение. Инициализирует только 1 раз.

 

void main (void){

int count;

for (count=1; count<5; count ++){

printf ("%d\n", count);

fun ();

}

}

void fun (void){

static int num;

int i=1;

printf ("%d %d\n", i, num++);

}

Ключевое слово register int i . Помещаются в регистры микропроцессора для увеличения скорости вычисления. Если нет свободного регистра, рассматриваются как автоматические. Область видимости блок, в котором были определены. По умолчанию не инициализируются.

 

Ключевое слово auto. Определяются внутри любого блока. Время жизни работа блока. Создаются в области стека. Область видимости блок, в котором были определены. По умолчанию не инициализируются.

 

Пример 1.

if (i==1){

int j=0;

int k=1;

i++;

}

printf(“%d %d”,j,k); //сообщение об ошибке

 

Пример 2.

int i;

......

{

int i; Внешнее i не видимо

......

}

...... Здесь опять ее видно

Существуют понятия: область видимости и область существования. Область видимости не может выходить за область существования, но область существования может превышать область видимости.

 

 

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

 

Файл 1 Файл 2

 

Таблица 1. Классы памяти и инициализация

Класс Хранения Внешний Extern Внешний Статический static Аргумен. Функции Автоматические auto Регистровые Register Внурен. Статические Static
Область действия Программа Модуль Функция Блок Блок Блок
Время Жизни Программа Программа Функция Блок Блок Программа
Область Хранения Сегмент Данных Сегмент данных Сегмент стека Сегмент стека Регистры МП Сегмент данных
Инициал-емость объектов Все Все Не раз-решена в Си Все в С++   Все Все
Момент инициализации На стадии Компил. На стадии компил. При входе в блок При входе в блок При входе в блок На стадии компил.
Инициализация по умолчан. Инициализируются 0 Инициализируются 0 Значение указывается Значение не опред. Значение не опред. Инициализируется 0