Почему extern может применяться к определениям? - PullRequest
9 голосов
/ 23 октября 2011

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

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

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

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

Ответы [ 3 ]

7 голосов
/ 23 октября 2011

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

extern const int foo = 0xF00;

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

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

2 голосов
/ 23 октября 2011

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

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

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

0 голосов
/ 23 октября 2011

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

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

...