Почему переопределение статической глобальной переменной приводит к ошибке времени компиляции, а переопределение глобальной переменной - нет? - PullRequest
7 голосов
/ 27 августа 2011

Компиляция кода 1 выдает ошибку 'i redefined', но код 2 не показывает аналогичной ошибки.Почему это так?

Код 1

static int i;        //Declaring the variable i.
static int i=25;     //Initializing the variable.
static int i;        //Again declaring the variable i.
int main(){       
    return 0;
}

Код 2

int i;        //Declaring the variable i.
int i=25;     //Initializing the variable.
int i;        //Again declaring the variable i.
int main(){       
    return 0;
}

1 Ответ

10 голосов
/ 27 августа 2011

Оба должны скомпилироваться.

И int i;, и static int i; являются предварительными определениями в C, поскольку они не имеют инициализатора и не extern. Вам разрешено несколько предварительных объявлений и самое большее одно не предварительное определение для любого объекта в единице перевода, если определения не конфликтуют в типе или связи.

ИСО / МЭК 9899: 1999 6.9.2:

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

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