Кроме функций внешние файлы могут содержать различные объекты - переменные и константы. Для подключения внешних объектов в файл кода применяется ключевое слово 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; } }