Почему к определениям можно применять extern?

Почему это законно?

extern int foo = 0xF00; // Gets a warning, still compiles

extern void bar() { // No warning
  int x;
}

Есть ли причина, почему это разрешено?


person Pubby    schedule 23.10.2011    source источник


Ответы (3)


Иногда это полезно

extern const int foo = 0xF00;

Без extern в C ++ foo был бы static и имел бы внутреннюю связь (что означает, что вы не могли бы использовать foo из другой единицы перевода).

extern в обоих случаях в вашем примере является избыточным. В C99 extern может иметь значение для inline функций..

person Johannes Schaub - litb    schedule 23.10.2011
comment
@ninjalj да, верно. В C foo была бы внешняя связь даже без extern. - person Johannes Schaub - litb; 25.10.2011

В случае с функцией, я думаю, это как писать:

extern void bar();
void bar()
{
  int x;
}

что должно быть законным, поскольку файл с определением может включать заголовок с таким объявлением.

person selalerer    schedule 23.10.2011

IIUC, в стандарте C определение обрабатывается так же, как объявление с инициализатором, поэтому все, что применяется к объявлениям, одинаково применяется к определениям.

(Фактически, определение было бы объявлением, которое выделяет память для переменной, поэтому предварительные определения C (которые не имеют инициализаторов) будут квалифицированы, и те объявления C ++, которые действуют как определения без инициализаторов, также будут квалифицированы. определение по сути является декларацией плюс еще применяется некоторое дополнительное поведение).

person ninjalj    schedule 23.10.2011