#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;