Когда использовать extern в C++
Я читаю "думаю в C++" , и он только что представил extern
декларации. Например:
extern int x;
extern float y;
Я думаю, что я понимаю смысл (объявление без определения), но мне интересно, когда это окажется полезным.
может кто-нибудь привести пример?
5 ответов:
это очень полезно, когда у вас есть глобальные переменные. Вы объявляете существование глобальных переменных в заголовке, так что каждый исходный файл, который включает заголовок, знает об этом, но вам нужно только "определить" его один раз в одном из ваших исходных файлов.
разъяснить, используя
:extern int x;
сообщает компилятору, что объект типаint
под названием где-то. Это не работа компиляторов, чтобы знать, где он существует, ему просто нужно знать введите и имя, чтобы он знал, как его использовать. Как только все исходные файлы будут скомпилированы, компоновщик разрешит все ссылки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; }
это полезно, когда вы разделяете переменную между несколькими модулями. Вы определяете его в одном модуле и используете extern в других.
например:
в file1.cpp:
int global_int = 1;
в file2.cpp:
extern int global_int; //in some function cout << "global_int = " << global_int;
о связь.
предыдущие ответы давали хорошие объяснения о
extern
.но я хочу добавить важный момент.
вы спрашиваете о
extern
на C++ не в C и я не знаю, почему ответа нет упоминания о случае, когдаextern
входитconst
в C++.в C++, a
const
переменная имеет внутреннюю связь по умолчанию (не нравится С.)так что этот сценарий приведет к связывание ошибка:
Источник 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
Это полезно, когда вы хотите иметь глобальную переменную. Вы определяете глобальные переменные в некотором исходном файле и объявляете их extern в файле заголовка, чтобы любой файл, который включает этот файл заголовка, видел ту же самую глобальную переменную.
когда у вас есть глобальные переменные, вы должны объявить их extern в любой единице перевода, в которой они не определены, или вы получите несколько определений. Этого, конечно, следует избегать, поскольку глобалы, как правило, не очень хороши.
когда вы пишете на C и хотите разрешить пользователям C++ использовать вашу библиотеку, вы объявляете свой материал в
extern "C" {}
заблокировать. Поскольку C отстой, вам это тоже не нужно.и тогда есть шаблоны extern, которые не являются частью стандарта больше.
наконец, есть объявление экземпляра шаблона, который происходит где-то еще, и вы хотите связать с ним, а не создавать новый. Вы объявляете эти extern также. Это имеет случайное использование...возможно...И никогда не было.
Я думаю, что могу подсчитать количество раз, когда мне нужен "extern" в C++, с одной стороны, так как я склонен избегать всех конструкций, в которых это необходимо.