Когда использовать 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