Когда использовать extern в C++


Я читаю "думаю в C++" , и он только что представил extern декларации. Например:

extern int x;
extern float y;

Я думаю, что я понимаю смысл (объявление без определения), но мне интересно, когда это окажется полезным.

может кто-нибудь привести пример?

5 281

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++, с одной стороны, так как я склонен избегать всех конструкций, в которых это необходимо.