История изменений
Исправление xaizek, (текущая версия) :
может быть определение с инициализацией нулём
глобальные заполняются нулями, если инициализатор отсутствует
всё неоднозначное объявляется в объектном файле как common symbol (C)
Вот это всё одно и то же и происходит в этом случае:
int i;
double d;
void *bla;
<type> name;
Получается, что компилятор уже знает, будет ли объявление заполнять переменную нулями, либо же только объявит. Тогда для компилятора в этом не должно быть неоднозначности, вроде (и для пишущего программу тоже).
В том то и дело, что нет, поэтому делает допущение, что это определение, полагаясь на линкер. Линкер потом разберётся на основании того, будет ли где-то объявление с явной инициализацией или нет. У определения с инициализацией приоритет выше, поэтому компилятор может безопасно предполагать, что видит определение.
Или там логика такая: не указано, что именно будет в переменной при её объявлении -> неоднозначность -> в объектном файле обозначаем как «C», и фишка именно в том, что в исходнике ничто про значение не указано?
Да, вроде такого.
Исправление xaizek, :
может быть определение с инициализацией нулём
глобальные заполняются нулями, если инициализатор отсутствует
всё неоднозначное объявляется в объектном файле как common symbol (C)
Вот это всё одно и то же и происходит в этом случае:
int i;
double d;
void *bla;
<type> name;
Получается, что компилятор уже знает, будет ли объявление заполнять переменную нулями, либо же только объявит. Тогда для компилятора в этом не должно быть неоднозначности, вроде (и для пишущего программу тоже).
В том то и дело, что нет, поэтому делает допущение, что это объявление, полагаясь на линкер. Линкер потом разберётся на основании того, будет ли где-то объявление с явной инициализацией или нет. У определения с инициализацией приоритет выше, поэтому компилятор может безопасно предполагать, что видит определение.
Или там логика такая: не указано, что именно будет в переменной при её объявлении -> неоднозначность -> в объектном файле обозначаем как «C», и фишка именно в том, что в исходнике ничто про значение не указано?
Да, вроде такого.
Исходная версия xaizek, :
может быть определение с инициализацией нулём
глобальные заполняются нулями, если инициализатор отсутствует
всё неоднозначное объявляется в объектном файле как common symbol (C)
Вот это всё одно и то же и происходит в этом случае:
int i;
double d;
void *bla;
<type> name;
Получается, что компилятор уже знает, будет ли объявление заполнять переменную нулями, либо же только объявит. Тогда для компилятора в этом не должно быть неоднозначности, вроде (и для пишущего программу тоже).
В том то и дело, что нет, поэтому делает допущение, что это объявление, полагаясь на линкер. Линкер потом разберётся на основании того, будет ли где-то объявление с явной инициализацией или нет. У объявления с инициализацией приоритет выше, поэтому компилятор может безопасно предполагать, что видит определение.
Или там логика такая: не указано, что именно будет в переменной при её объявлении -> неоднозначность -> в объектном файле обозначаем как «C», и фишка именно в том, что в исходнике ничто про значение не указано?
Да, вроде такого.