Кроме функций внешние файлы могут содержать различные объекты - переменные и константы. Для подключения внешних объектов в файл кода применяется ключевое слово extern.
Например, пусть у нас есть файл objects.cpp, в котором определяюься :
#include <string>
std::string message {"Hello"};
unsigned times {3};
Здесь определены переменные типа std::string и unsigned int. Для использования типа std::string необходимо подключить заголовочный файл <string>
Пусть главный файл программы называется app.cpp и использует эти переменные:
#include <iostream>
#include <string>
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>
#include <string>
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;
}
}