Можно ли указывать ключевое слово extern как в определении, так и в объявлении

#c

#c

Вопрос:

Я знаю, что extern ключевое слово в C можно использовать, чтобы сообщить компилятору, что конкретная переменная имеет внешнюю связь (она определена в другой единице перевода):

 // first.cpp

int foo = 0;

// second.cpp

extern int foo;
  

Но как насчет следующего использования?

 // first.cpp

extern int foo = 0;

// second.cpp

extern int foo;
  

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

Это нормально? Если да, то в чем разница?

Комментарии:

1. Согласно этому сайту , стандарт C определяет «если переменная только объявлена, и инициализатор также предоставляется с этим объявлением, тогда память для этой переменной будет выделена, т.Е. Эта переменная будет считаться определенной» . Кроме того, компилятор выдает ошибки, если вы пытаетесь добавить другое определение переменной.

Ответ №1:

 extern int foo = 0;
  

совпадает с

 int foo = 0;
  

для всех практических целей. extern Ключевое слово является избыточным, но не неправильным.

Однако есть разница между

 extern int foo;
  

и

 int foo;
  

Первое — это объявление, а второе — определение.

Ответ №2:

Обратите внимание, что extern это не информирует компилятор о том, что определение foo находится в другой единице перевода. Все, что он делает, объявляет о своем существовании.

So foo может быть объявлено много раз. Но его можно инициализировать только один раз.

Следовательно, в вашем конкретном случае ваша запись extern int foo = 0; эквивалентна int foo = 0;