Рассмотрим следующую программу. Это даст какие-либо ошибки компиляции?
#include <stdio.h>
int s=5;
int s;
int main(void)
{
printf("%d",s);
}
На первый взгляд кажется, что компилятор даст переменную ошибку переопределения, но программа отлично действует в соответствии со стандартом C. (Смотрите демо-версию здесь http://ideone.com/Xyo5SY).
Предварительное определение - это любое объявление внешних данных, которое не имеет спецификатора класса хранения и не имеет инициализатора.
C99 6.9.2/2
Объявление идентификатора для объекта, который имеет область действия без инициализатор и без спецификаций класса хранения или с класс хранения, статический, представляет собой предварительное определение. Если единица перевода содержит одно или несколько предварительных определений для идентификатор, а единица перевода не содержит внешнего определения для то идентификатор, то поведение точно такое же, как если бы перевод единица содержит объявление области видимости этого идентификатора, а составного типа на конце единицы перевода, с инициализатор равен 0.
Мой вопрос в том, что является обоснованием для разрешения предварительных определений? Есть ли использование этого в C? Почему C разрешает предварительные определения?