В Си действительно ли объявить переменную несколько раз? - PullRequest
6 голосов
/ 21 июля 2011

У меня есть приведенный ниже код C, и я ожидаю, что он выдаст ошибку типа «множественное объявление переменной», но это не так.

#include <stdio.h>

int i;        
int i;    

int main()
{
    printf("%d",i);
    return 0;
}

Теперь вывод равен 0,но почему?

И еще один код, приведенный ниже, дает ошибку, которая ожидается

#include <stdio.h>


int main()
{
    int i;        
    int i;    

    printf("%d",i);
    return 0;
}

O / p - ошибка, сообщающая повторное объявление i

1 Ответ

17 голосов
/ 21 июля 2011

Первое определение i является предварительным определением (2-е также является предварительным определением).Хотя они являются де-факто определениями (и определения служат также декларациями), в этом нет ошибки.

Цитата из Стандарт :

6.9.2/2

Объявление идентификатора для объекта, который имеет область файла без инициализатора и без спецификатора класса хранения или со статическим спецификатором класса хранения, составляет предварительное определение.Если модуль перевода содержит одно или несколько предварительных определений для идентификатора, а модуль перевода не содержит внешнего определения для этого идентификатора, то поведение точно такое, как если бы модуль перевода содержал объявление области файла для этого идентификатора с составным типом какконца блока перевода, с инициализатором, равным 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...