Я читаю "Думай в C ++", и он только что представил extern
объявление. Например:
extern int x;
extern float y;
Я думаю, что понимаю значение (декларация без определения), но мне интересно, когда это окажется полезным.
Может кто-нибудь привести пример?
c++
variable-declaration
Aslan986
источник
источник
extern
в нескольких случаях. Инструменты Microsoft создали ошибку ссылки для отсутствующих символов, когда таблицы в другом исходном файле были определены только. Проблема была в том, что таблица была,const
и компилятор C ++ сделал этоstatic
в модуле перевода. Смотри, например,ariatab.cpp
иkalynatab.cpp
.Ответы:
Это полезно, когда у вас есть глобальные переменные. Вы объявляете о существовании глобальных переменных в заголовке, так что каждый исходный файл, содержащий заголовок, знает об этом, но вам нужно только «определить» его один раз в одном из ваших исходных файлов.
Чтобы уточнить, использование
extern int x;
сообщает компилятору, что объект сint
именем типаx
существует где-то . Это не работа компилятора, чтобы знать, где он существует, просто нужно знать тип и имя, чтобы он знал, как его использовать. Как только все исходные файлы скомпилированы, компоновщик разрешит все ссылкиx
на одно определение, которое он найдет в одном из скомпилированных исходных файлов. Чтобы это работало, определениеx
переменной должно иметь то, что называется «внешней связью», что в основном означает, что она должна быть объявлена вне функции (в том, что обычно называется «областью действия файла») и безstatic
ключевого слова.заголовок:
источник 1:
источник 2:
источник
Это полезно, когда вы разделяете переменную между несколькими модулями. Вы определяете это в одном модуле, и используете extern в других.
Например:
в file1.cpp:
в file2.cpp:
источник
global_int
в глобальном пространстве имен, если бы я использовал его в file2.cpp в каком-то разделе пространства имен, я должен был бы охватить это правильно? то естьnamespace XYZ{ void foo(){ ::global_int++ } };
abc.h
, есть большая вероятность, что она будет определена вabc.cpp
. Хорошая IDE всегда поможет, но хорошо организованный код - всегда лучшее решение.extern
в file2.cpp, все еще может получить доступglobal_int
после включения. зачем мне это надо?Это все о связи .
Предыдущие ответы дали хорошие объяснения о
extern
.Но я хочу добавить важный момент.
Вы спрашиваете
extern
в С ++ не в C , и я не знаю , почему нет ответа упоминать о том случае , когдаextern
приходит сconst
в C ++.В C ++
const
переменная по умолчанию имеет внутреннюю связь (не как C).Так что этот сценарий приведет к ошибке компоновки :
Источник 1:
Источник 2:
Это должно быть так:
Источник 1:
Источник 2:
источник
extern
определения? Вы можете сделать это, распечатав значениеglobal
в источнике 2.extern
опущен вconst int global = 255;
.Это полезно, когда вы хотите иметь глобальную переменную. Вы определяете глобальные переменные в некотором исходном файле и объявляете их extern в заголовочном файле, чтобы любой файл, включающий этот заголовочный файл, мог видеть ту же самую глобальную переменную.
источник