Внешние объекты


Переменные, используемые в программе, могут быть не только глобальными, локальными или статическими, но также могут представлять внешние объекты. Такие объекты определены в каком-то внешнем файле. Кроме того, функции также могут внешними по отношению к другим функциям, то есть также могут быть определены в других файлах. И в этом случае встает вопрос организации взаимодействия между ними. Рассмотрим пример такого взаимодействия.

Пусть у нас в программе будет два файла: главный файл app.c и вспомогательный файл main.c.

Внешние объекты в языке программирования Си
Файл app.c будет содежать следующий код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>

extern int y; // переменная из файла main.c
void func2(void); // функция func2 из main.c
void func3(void); // функция func3 из main.c

int x = 10;

int main(void)
{
func3();
return 0;
}

void func1()
{
printf("func1: x=%d \t y=%d \n", x, y);
func2();
}
И содержимое файла main.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>

extern int x; // переменная из файла app.c
void func1(void); // функция func1 из app.c

int y = 20;

void func2()
{
printf("func2: y=%d \n", y);
}
int z = 30;

void func3()
{
func1();
printf("func3: x=%d \t y=%d \t z=%d \n", x, y, z);
}
Оба файла используют функции и переменные друг друга. Если переменная определена во внешнем файле, то перед ее использованием должно идти ее описание с ключевым словом extern. В частности, в файле app.c определена переменная x. Но чтобы ее использовать в файле main.c, нам надо в этом файле поместить ее описание:

1
extern int x;
Описание переменной в принципе совпадает с ее определением, только при описании ей нельзя присваивать какое-либо значение.

Если мы хотим использовать внешние функции, то перед их использованием надо определить их прототип. Так, в файле app.c определена функция func1, поэтому в файле main.c перед вызовом этой функции помещается ее прототип:

1
void func1(void);
То же самое касается использования переменных и функций из файла main.c в файле app.c.

При компиляции в Visual Studio ничего дополнительно не надо делать - среда разработки автоматически скомпилирует оба файла в одну программу.

При компиляции через GCC компилятору надо последовательно через пробел передать имена файлов:

gcc app.c main.c