Когда использовать extern в С++
Я читаю "Think in С++", и он просто представил объявление extern
. Например:
extern int x;
extern float y;
Я думаю, что понимаю смысл (декларация без определения), но мне интересно, когда это окажется полезным.
Может ли кто-нибудь привести пример?
Ответы
Ответ 1
Это полезно, когда у вас есть глобальные переменные. Вы объявляете существование глобальных переменных в заголовке, так что каждый исходный файл, который содержит заголовок, знает об этом, но вам нужно только "определить" его один раз в одном из ваших исходных файлов.
Чтобы уточнить, использование extern int x;
сообщает компилятору, что существует объект типа int
, называемый x
. Это не задача компиляторов, чтобы знать, где она существует, просто нужно знать тип и имя, чтобы он знал, как его использовать. После того как все исходные файлы были скомпилированы, компоновщик разрешит все ссылки x
на одно определение, которое оно находит в одном из скомпилированных исходных файлов. Для его работы определение переменной x
должно иметь то, что называется "внешняя связь", что в основном означает, что оно должно быть объявлено вне функции (при том, что обычно называется "область файла" ), и без static
.
Заголовок:
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
источник 1:
#include "header.h"
// it needs to be defined somewhere
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
источник 2:
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
Ответ 2
Это полезно, когда вы разделяете переменную между несколькими модулями. Вы определяете его в одном модуле и используете extern в других.
Например:
в файле file1.cpp:
int global_int = 1;
в файле2.cpp:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
Ответ 3
Это все о связи.
Предыдущие ответы давали хорошие объяснения об extern
.
Но я хочу добавить важный момент.
Вы спрашиваете об extern
в C++, а не в C, и я не знаю, почему нет ответа, упоминающего случай, когда extern
поставляется с const
в C++.
В C++ переменная const
по умолчанию имеет внутреннюю связь (не как C).
Таким образом, этот сценарий приведет к ошибке компоновки:
Источник 1:
const int global = 255; //wrong way to make a definition of global const variable in C++
Источник 2:
extern const int global; //declaration
Это должно быть так:
Источник 1:
extern const int global = 255; //a definition of global const variable in C++
Источник 2:
extern const int global; //declaration
Ответ 4
Это полезно, если вы хотите иметь глобальную переменную. Вы определяете глобальные переменные в некотором исходном файле и объявляете их extern в заголовочном файле, чтобы любой файл, который включает этот файл заголовка, затем видел одну и ту же глобальную переменную.
Ответ 5
Когда у вас есть глобальные переменные, вы должны объявить их extern в любом модуле перевода, в котором они не определены, иначе вы получите несколько определений. Этого, конечно, следует избегать, поскольку глобальные переменные обычно не очень хороши.
Когда вы пишете на C и хотите разрешить пользователям C++ использовать вашу библиотеку, вы объявляете свои вещи во внешнем блоке extern "C" {}
. Так как С отстой, вам это тоже не нужно.
Наконец, существует объявление экземпляра шаблона, которое происходит где-то еще, и вы хотите сделать ссылку на него, а не создавать новый. Вы объявляете эти внешние тоже. Это имеет случайное использование... возможно... я никогда не имел.
Я думаю, что могу посчитать, сколько раз мне нужно было "extern" в C++ с одной стороны, поскольку я стараюсь избегать всех конструкций, в которых это было необходимо.
Ответ 6
Здравствуйте, посмотрите это 8-минутное видео с YouTube: https://www.youtube.com/watch?v=m5Y3Ghv2PUE.
Для получения дополнительной информации, если вы уже здесь с этой проблемой синтаксиса:
Как работает компоновщик C++: https://www.youtube.com/watch?v=H4s55GgAg0I
Понимание статики C++: https://www.youtube.com/watch?v=f3FVU-iwNuA&t=8s
Внешний и статический: https://www.youtube.com/watch?v=hDfDnsvEodQ&t=208s