Добавление в проект заголовочного файла

Помимо файлов с исходным кодом (в языке C++ они имеют расширение cpp, а в языке C — расширение c) в проекте могут быть заголовочные файлы (в языке C++ они имеют расширение hpp или h). В заголовочных файлах указываются прототипы функций и различные объявления.

Для создания заголовочного файла в окне Проекты щелкаем правой кнопкой мыши на названии проекта и из контекстного меню выбираем пункт Добавить новый. В открывшемся окне (рис. 2.7) из списка слева выбираем пункт C/C++, а из списка справа — пункт Заголовочный файл C/C++. Нажимаем кнопку Выбрать. На следующем шаге (рис. 2.8) вводим название HelloWorld.hpp в поле Имя файла. В поле Путь указываем значение C:\cpp\projectsQt\HelloWorld. Нажимаем кнопку Далее. На следующем шаге (рис. 2.9) нажимаем кнопку Завершить.

2_7.png

Рис. 2.7. Создание заголовочного файла. Шаг 1

2_8.png

Рис. 2.8. Создание заголовочного файла. Шаг 2

2_9.png

Рис. 2.9. Создание заголовочного файла. Шаг 3

Созданный файл отобразится на вкладке Проекты и будет открыт на отдельной вкладке для редактирования. Причем внутри файла будет вставлен код, приведенный в листинге 2.2. В файл HelloWorld.pro будут добавлены следующие строки:

HEADERS += \
   HelloWorld.hpp

Листинг 2.2. Содержимое файла HelloWorld.hpp

#ifndef HELLOWORLD_HPP
#define HELLOWORLD_HPP

#endif // HELLOWORLD_HPP

Текст после символов // является комментарием. Инструкции, начинающиеся с символа #, — это директивы препроцессора. В нашем примере их три:

  • #ifndef — проверяет отсутствие константы с именем HELLOWORLD_HPP;
  • #define — создает константу с именем HELLOWORLD_HPP;
  • #endif — обозначает конец блока проверки отсутствия константы.

Зачем нужны эти директивы препроцессора? Заголовочный файл мы подключаем к файлу с исходным кодом с помощью директивы #include:

#include "HelloWorld.hpp"

Встретив в исходном коде директиву #include компилятор вставляет все содержимое заголовочного файла на место директивы. Если мы вставим две одинаковые директивы #include, то содержимое заголовочного файла будет вставлено дважды. Так как объявить один идентификатор (например, глобальную переменную) дважды нельзя, компилятор выведет сообщение об ошибке. Чтобы этого избежать, прототипы функций и прочие объявления вкладываются в блок, ограниченный директивами #ifndef и #endif. В директиве #ifndef указывается константа, совпадающая с названием заголовочного файла. Все буквы в имени константы заглавные, а точка заменена символом подчеркивания. Если константа не существует (при первом включении заголовочного файла так и будет), то с помощью директивы #define эта константа создается и содержимое блока вставляется в исходный код. При повторном включении заголовочного файла константа уже существует, поэтому содержимое блока будет проигнорировано. Таким образом заголовочный файл дважды вставлен не будет, а значит и ошибки не будет.

Вместо этих директив можно указать в самом начале заголовочного файла директиву препроцессора #pragma со значением once, которая также препятствует повторному включению файла (в старых компиляторах директива может не поддерживаться):

#pragma once
// Объявление функций и др.

Название заголовочного файла в директиве #include может быть указано внутри угловых скобок:

#include <iostream>

или внутри кавычек:

#include "HelloWorld.hpp"

В первом случае заголовочный файл ищется в путях поиска заголовочных файлов. При этом текущий рабочий каталог не просматривается. Добавить каталог в пути поиска заголовочных файлов позволяет флаг -I в команде компиляции. Обычно с помощью угловых скобок включаются заголовочные файлы стандартной библиотеки или библиотеки стороннего разработчика.

Во втором случае мы имеем дело с заголовочным файлом, который вначале ищется в текущем рабочем каталоге (или относительно него), а затем в путях поиска заголовочных файлов, как будто название указано внутри угловых скобок. Таким способом обычно включаются заголовочные файлы проекта.

Внимательный читатель наверняка обратил внимание на то, что файл iostream не содержит расширение. Наличие расширения файла принято в стандартной библиотеке языка C. В стандартной библиотеке языка C++ расширение файла принято не указывать. Так как язык C++ наследует все библиотеки языка C, то файлы можно подключать как в стиле языка C, так и в стиле языка C++. Например, файл string.h из стандартной библиотеки языка C доступен в языке C++ под названием cstring, а файл math.h под названием cmath. Отличие между этими способами подключения заключается в импорте идентификаторов. В языке C при подключении файла (например, math.h) все идентификаторы импортируются в глобальное пространство имен, а в языке C++ при подключении файла (например, cmath) идентификаторы добавляются в пространство имен под названием std. Поэтому перед идентификатором необходимо указать название пространства имен (например, std::cout). Использование пространств имен позволяет избежать конфликта имен в программе.

Можно указать просто название заголовочного файла:

#include "HelloWorld.hpp"

абсолютный путь к нему:

#include "C:\\cpp\\projectsQt\\HelloWorld\\HelloWorld.hpp"

или относительный путь к нему:

#include "./HelloWorld.hpp"

Если указано только название заголовочного файла и этот файл не входит с состав проекта (или название указано внутри угловых скобок), то нужно дополнительно указать место поиска заголовочных файлов. Путь к заголовочным файлам в командной строке добавляется с помощью флага -I:

g++ -Wall -O3 "-IC:\\Program Files\\Java\\jdk-10\\include" 
    "-IC:\\Program Files\\Java\\jdk-10\\include\\win32" 
    -o helloworld.exe helloworld.cpp

В нашем случае путь содержит пробел, поэтому весь путь указывается внутри кавычек. Если пробелов нет, то кавычки можно не указывать.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов