Почему это законно?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
Есть ли причина, почему это разрешено?
Почему это законно?
extern int foo = 0xF00; // Gets a warning, still compiles
extern void bar() { // No warning
int x;
}
Есть ли причина, почему это разрешено?
Иногда это полезно
extern const int foo = 0xF00;
Без extern
в C ++ foo
был бы static
и имел бы внутреннюю связь (что означает, что вы не могли бы использовать foo
из другой единицы перевода).
extern
в обоих случаях в вашем примере является избыточным. В C99 extern
может иметь значение для inline
функций..
foo
была бы внешняя связь даже без extern
.
- person Johannes Schaub - litb; 25.10.2011
В случае с функцией, я думаю, это как писать:
extern void bar();
void bar()
{
int x;
}
что должно быть законным, поскольку файл с определением может включать заголовок с таким объявлением.
IIUC, в стандарте C определение обрабатывается так же, как объявление с инициализатором, поэтому все, что применяется к объявлениям, одинаково применяется к определениям.
(Фактически, определение было бы объявлением, которое выделяет память для переменной, поэтому предварительные определения C (которые не имеют инициализаторов) будут квалифицированы, и те объявления C ++, которые действуют как определения без инициализаторов, также будут квалифицированы. определение по сути является декларацией плюс еще применяется некоторое дополнительное поведение).