Использование ключевого слова extern при определении переменной - PullRequest
2 голосов
/ 30 сентября 2011

После просмотра этого ответа у меня возникли сомнения.В моем проекте я видел некоторые внешние переменные, объявленные и определенные, как показано ниже:

file1.h

extern int a;

file1.c

extern int a=10;

Но в упомянутой мной ссылке сказано, что в файле c его следует определить следующим образом:

int a = 10;

Добавляет лиextern ключевое слово во время определения тоже имеет какое-либо назначение / значение.Или это кстати имеет значение?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Это не меняет смысла.extern имеет смысл только тогда, когда вы объявляете переменную. Определение переменной с extern одинаково, поскольку все глобальные переменные, которые не отмечены static, являются символами, видимыми для компоновщика по умолчанию.

Обратите внимание, что если вы не хотитечтобы инициализировать переменную, то есть не имея части = 10, компилятор предположит, что extern int a всегда является объявлением , а не определением .В том же смысле глобальное int a всегда является определением , а не просто декларацией .

3 голосов
/ 30 сентября 2011

Это зависит.В этом случае это не имеет значения, но может.

Здесь есть две проблемы: определение вместо простого объявления и связь.И 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.)

...