Понимание объявления / инициализации статических переменных в C

У меня есть только один файл в моем проекте под названием test.c; код ниже не компилируется, если я не определяю «ИСТИНА». Я использую vc. Я просто хочу понять поведение. Пожалуйста, пролите свет на этот аспект.

#ifdef TRUE static int a; static int a = 1; #else static int a = 1; static int a; #endif int main (void) { printf("%d\n", a); return 0; } ----------------------- #ifdef TRUE // both ok int a; int a = 1; #else // both ok int a = 1; int a; #endif int main (void) { printf("%d\n", a); return 0; } 

Это потому, что вы не можете объявить переменную после того, как вы ее определили. Однако вы можете определить переменную после ее объявления.

 #ifdef TRUE static int a; //Declaring variable a static int a = 1; //define variable a #else static int a = 1; //define variable a static int a; //Error! a is already defined so you can not declare it #endif 

По-видимому, компилятор не позволяет переопределить переменную, которая была инициализирована.