В стандарте ansi они называют int x;
«предварительным» определением.
Это то, что стандарт ANSI говорит:
Декларация идентификатора для объекта, который имеет файл объем без инициализатора, и без хранения класса спецификатора или с хранения класса спецификатора статического , представляет собой предварительное определение . Если единица перевода содержит одно или несколько предварительных определений для идентификатора, а единица перевода не содержит внешнего определения для этого идентификатора , то поведение точно равно , как если бы единица перевода содержала объявление области файла этого идентификатора области , с композит типа, как в конце блока перевода с инициализатором равным 0.
с примерами:
int i1 = 1; /* definition, external linkage */
static int i2 = 2; /* definition, internal linkage */
extern int i3 = 3; /* definition, external linkage */
int i4; /* tentative definition, external linkage */
static int i5; /* tentative definition, internal linkage */
int i1; /* valid tentative definition, refers to previous */
int i2; /* $3.1.2.2 renders undefined, linkage disagreement */
int i3; /* valid tentative definition, refers to previous */
int i4; /* valid tentative definition, refers to previous */
int i5; /* $3.1.2.2 renders undefined, linkage disagreement */
extern int i1; /* refers to previous, whose linkage is external */
extern int i2; /* refers to previous, whose linkage is internal */
extern int i3; /* refers to previous, whose linkage is external */
extern int i4; /* refers to previous, whose linkage is external */
extern int i5; /* refers to previous, whose linkage is internal */
в моем понимании, вы можете иметь столько предварительного défini одного и того же объекта, который вы хотите, и не более одного определения (с инициализатором). Если определения нет, предварительные определения превращаются в определение с инициализатором == 0 в конце файла.
Другими словами, напечатанное значение равно 35, поскольку имеется инициализатор.
Этот код не компилируется. И почему вы используете 'void main()' ?! –
Существует только одно определение. – haccks
@haccks: какой? –