Доступ к функциям в многомодульной программе
Автоматические переменные
Регистровая переменная
Внутренняя статическая переменная
Локальные переменные
Статистические внешние переменные - 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 |