Внешние объекты

Последнее обновление: 31.03.2023

Кроме функций внешние файлы могут содержать различные объекты - переменные и константы. Для подключения внешних объектов в файл кода применяется ключевое слово extern.

Например, пусть у нас есть файл objects.cpp, в котором определяюься :

#include <string>

std::string message {"Hello"};
unsigned times {3};

Здесь определены переменные типа std::string и unsigned int. Для использования типа std::string необходимо подключить заголовочный файл <string>

Пусть главный файл программы называется app.cpp и использует эти переменные:

#include <iostream>

extern std::string message;
extern unsigned times;

int main()
{
    for(unsigned i{}; i < times; i++)
    {
        std::cout << message << std::endl;
    }
}

Чтобы использовать переменные, определенные во внешнем файле, они объявляются с помощью ключевого слова extern

extern std::string message;
extern unsigned times;

В функции main в цикле times раз выводим строку message на консоль.

При компиляции через g++ необходимо передать все файлы через пробел компилятору:

g++ app.cpp objects.cpp -o app

Здесь подразумевается, что файлы app.cpp и objects.cpp располагаются в одной папке. То же самое верно и для компиляции через Clang::

clang++ app.cpp objects.cpp -o app.exe

На выходе будет сгенерирован единый файл app. А консольный вывод программы будет следующим

Hello
Hello
Hello

Подключение констант

Подключение констант имеет особенность - ключевое слово extern надо указывать и при определении константы. Так, изменим файл objects.cpp следующим образом:

#include <string>

extern const std::string message {"Hello"};	// константа
unsigned times {3};

Также изменим файл app.cpp:

#include <iostream>

extern const std::string message;   // подключаем константу
extern unsigned times;

int main()
{
    for(unsigned i{}; i < times; i++)
    {
        std::cout << message << std::endl;
    }
}

Результат будет тот же, что и в предыдущем случае.

Вынесение объявления в заголовочные файлы

В примере выше мы вынуждены подключать в главный файл программы два внешних объекта. Но что, если этих переменных и констант очень много? Чтобы не загрязнять главный файл программы, мы можем, как и в случае с внешними функциями, вынести объявления внешних объектов в отдельный заголовочный файл. Так, определим в той же папке, где располагаются файлы app.cpp и objects.cpp, новый файл - objects.h:

extern const std::string message;   // подключаем константу
extern unsigned times;

Теперь подключим этот заголовочный файл в файле app.cpp:

#include <iostream>
#include "objects.h"		// подключаем внешние объекты

int main()
{
    for(unsigned i{}; i < times; i++)
    {
        std::cout << message << std::endl;
    }
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850