Несколько объявлений С++ в локальной области видимости

Насколько я знаю, в C++ можно объявлять одно и то же имя несколько раз, если оно имеет один и тот же тип во всех этих объявлениях. Чтобы объявить объект типа int, но НЕ определить его, используется ключевое слово extern. Таким образом, следующее должно быть правильным и компилироваться без ошибок:

extern int x;
extern int x; // OK, still declares the same object with the same type.
int x = 5;    // Definition (with initialization) and declaration in the same
              // time, because every definition is also a declaration.

Но как только я переместил это внутрь функции, компилятор (GCC 4.3.4) жалуется, что я повторно объявляю x и что это незаконно. Сообщение об ошибке следующее:

test.cc:9: error: declaration of 'int x'
test.cc:8: error: conflicts with previous declaration 'int x'

где int x = 5; находится в строке 9, а extern int x находится в строке 8.

Мой вопрос:
Если несколько объявлений не должны быть ошибками, то ПОЧЕМУ это ошибка в данном конкретном случае?


person SasQ    schedule 03.03.2011    source источник


Ответы (1)


Объявление extern объявляет, что что-то имеет внешнюю связь (это означает, что определение должно появиться в области файла в какой-то единице компиляции, возможно, текущей). Локальные переменные не могут иметь внешней связи, поэтому компилятор жалуется, что вы пытаетесь сделать что-то противоречивое.

person Greg Hewgill    schedule 03.03.2011
comment
Чем ты, теперь я понимаю. Значит, нельзя просто объявить объект внутри функции, не определяя его одновременно? - person SasQ; 04.03.2011
comment
@SasQ: Да, я считаю, что это правда. - person Greg Hewgill; 04.03.2011