Вы включаете файл file2.h
, в котором вы объявили переменную как статическую в файле c, который имеет main, что так же хорошо, как и запись объявления в этом файле c.
Когда вы включаетефайл заголовка, который объявляет статическую переменную, копия переменной создается для каждой единицы перевода (c file + включенные файлы заголовка), в которую включен файл заголовка.
Никогда не объявляйте ваши статические переменные в заголовочном файле.
Чтобы проверить сценарий, вы должны сделать следующее:
//file1.c
static int i = 10;
//file2.c
extern int i;
int main()
{
int a = i;
return 0;
}