Это зависит.В этом случае это не имеет значения, но может.
Здесь есть две проблемы: определение вместо простого объявления и связь.И C ++ не обрабатывает их ортогонально.В C ++ объявление переменной или ссылки является определением тогда и только тогда, когда отсутствуют ни ключевое слово extern
, ни инициализация.(Обратите внимание, что правила для функций, типов и шаблонов различны.) Итак:
extern int a; // not a definition
int a; // definition
extern int a = 42; // definition
int a = 42; // definition
Правила говорят, что у вас должно быть ровно одно определение, поэтому вы помещаете определение в исходный файл, а объявление взаголовок.
Что касается связывания, символ, объявленный как переменная или ссылка, имеет внешнюю связь, если он объявлен в области имен, не объявлен static
и не является либо const
(ниconstexpr
в C ++ 11) или был объявлен extern
.Тот факт, что const
может давать переменную внутреннюю связь, иногда означает, что extern
необходим:
int const a = 42; // internal linkage
extern int const a = 42; // external linkage
Обратите внимание, что extern
не обязательно должно быть в том же объявлении:
extern int const a; // declaration, in header...
int const a = 42; // external linkage, because of
// previous extern
Тем не менее, мне иногда нужно было extern
;как правило, потому что я хочу использовать локальную константу для создания экземпляра шаблона.(Это проблема, только если параметр шаблона принимает указатель или ссылку. Вы можете создать экземпляр шаблона с параметром int
с int const a =
42;
, потому что шаблон создается со значением 42, а не с переменной a
.)