Цель ключевого слова extern
- дать сущности внешнюю связь .Используется ли оно в объявлении в или определении, не имеет значения.Там нет абсолютно никаких ошибок в коде, который вы опубликовали.
Если вы предпочитаете думать об этом с точки зрения «экспорт против импорта», тогда ключевое слово extern
применяется к неопределяющему объявлению означает, что мы импортируем сущность, определенную в некоторой другой единице перевода.Когда ключевое слово extern
применяется к определению , это означает, что мы экспортируем эту сущность для использования другими единицами перевода.(Хотя стоит отметить, что «экспорт против импорта» - это не совсем стандартный подход к концепции связи С).
Причина, по которой вы не увидите ключевое слово, используемое в определениях очень часто, заключается в том, чтопотому что в C определения области действия файла имеют внешнюю связь по умолчанию.Таким образом, написание
extern int i = 10;
является действительным, но избыточным, поскольку оно эквивалентно обычному
int i = 10;
Тем не менее, время от времени в реальном коде вы можете видеть людей, использующих это ключевое слово собъявления и определения функций, хотя они там и излишни
extern void foo(int i); /* `extern` is superfluous */
...
extern void foo(int i) /* `extern` is superfluous */
{
/* whatever */
}