Файлы заголовков (C++)
Имена элементов программы, таких как переменные, функции, классы и т. д., должны быть объявлены до их использования. Например, вы не можете просто написать x = 42 без первого объявления «x».
int x; // declaration x = 42; // use x
Объявление сообщает компилятору, является int ли элемент , функцией double , или class другой вещью. Кроме того, каждое имя должно быть объявлено (прямо или косвенно) в каждом CPP-файле, в котором он используется. При компиляции программы каждый CPP-файл компилируется независимо в единицу компиляции. Компилятор не знает, какие имена объявляются в других единицах компиляции. Это означает, что если вы определяете класс или функцию или глобальную переменную, необходимо указать объявление этой вещи в каждом дополнительном CPP-файле, который использует его. Каждое объявление этой вещи должно быть точно идентичным во всех файлах. Небольшое несоответствие приведет к ошибкам или непреднамеренное поведение, когда компоновщик пытается объединить все единицы компиляции в одну программу.
Чтобы свести к минимуму потенциал ошибок, C++ принял соглашение об использовании файлов заголовков для хранения объявлений. Вы делаете объявления в файле заголовка, а затем используйте директиву #include в каждом CPP-файле или другом файле заголовка, который требует этого объявления. Директива #include вставляет копию файла заголовка непосредственно в CPP-файл перед компиляцией.
В Visual Studio 2019 функция модулей C++20 представлена в качестве улучшения и окончательной замены файлов заголовков . Дополнительные сведения см. в разделе «Общие сведения о модулях в C++».
Пример
В следующем примере показан общий способ объявления класса и его использования в другом исходном файле. Начнем с файла заголовка, my_class.h . Он содержит определение класса, но обратите внимание, что определение является неполным; Функция-член do_something не определена:
// my_class.h namespace N < class my_class < public: void do_something(); >; >
Затем создайте файл реализации (обычно с расширением CPP или аналогичного расширения). Мы вызовем файл my_class.cpp и предоставим определение для объявления члена. Мы добавим директиву #include для файла «my_class.h», чтобы объявление my_class вставлялось в этот момент в CPP-файле, и мы включаем в объявление. std::cout Обратите внимание, что кавычки используются для файлов заголовков в том же каталоге, что и исходный файл, а для заголовков стандартной библиотеки используются угловые скобки. Кроме того, многие заголовки стандартной библиотеки не имеют расширения H или других файлов.
В файле реализации можно использовать using инструкцию, чтобы избежать необходимости квалифицировать каждую упоминание «my_class» или «cout» с «N::» или «std::». Не помещайте using инструкции в файлы заголовков!
// my_class.cpp #include "my_class.h" // header in local directory #include // header in standard library using namespace N; using namespace std; void my_class::do_something()
Теперь мы можем использовать my_class в другом CPP-файле. Мы #include файл заголовка, чтобы компилятор извлекал объявление. Все, что компилятор должен знать, является то, что my_class является классом, который имеет общедоступную do_something() функцию-член.
// my_program.cpp #include "my_class.h" using namespace N; int main()
После завершения компиляции каждого CPP-файла в OBJ-файлы он передает OBJ-файлы компоновщику. При слиянии компоновщика файлов объектов он находит точно одно определение для my_class; он находится в OBJ-файле, создаваемом для my_class.cpp, и сборка завершается успешно.
Включение охранников
Как правило, файлы заголовков имеют параметр include guard или директиву #pragma once , чтобы убедиться, что они не вставляются несколько раз в один CPP-файл.
// my_class.h #ifndef MY_CLASS_H // include guard #define MY_CLASS_H namespace N < class my_class < public: void do_something(); >; > #endif /* MY_CLASS_H */
Что нужно поместить в файл заголовка
Так как файл заголовка может быть включен несколькими файлами, он не может содержать определения, которые могут создавать несколько определений одного имени. Следующие действия не допускаются или считаются очень плохой практикой.
- встроенные определения типов в пространстве имен или глобальных область
- определения функций, отличных от встроенных
- Определения переменных, отличные от const
- агрегатные определения
- безымянные пространства имен
- Директивы using
using Использование директивы не обязательно приведет к ошибке, но может вызвать проблему, так как она приносит пространство имен в область в каждом CPP-файле, который прямо или косвенно включает этот заголовок.
Пример файла заголовка
В следующем примере показаны различные виды объявлений и определений, которые разрешены в файле заголовка:
// sample.h #pragma once #include // #include directive #include namespace N // namespace declaration < inline namespace P < //. >enum class colors : short < red, blue, purple, azure >; const double PI = 3.14; // const and constexpr definitions constexpr int MeaningOfLife< 42 >; constexpr int get_meaning() < static_assert(MeaningOfLife == 42, "unexpected!"); // static_assert return MeaningOfLife; >using vstr = std::vector; // type alias extern double d; // extern variable #define LOG // macro definition #ifdef LOG // conditional compilation directive void print_to_log(); #endif class my_class // regular class definition, < // but no non-inline function definitions friend class other_class; public: void do_something(); // definition in my_class.cpp inline void put_value(int i) < vals.push_back(i); >// inline OK private: vstr vals; int i; >; struct RGB < short r< 0 >; // member initialization short g< 0 >; short b< 0 >; >; template // template definition class value_store < public: value_store() = default; void write_value(T val) < //. function definition OK in template >private: std::vector vals; >; template // template declaration class value_widget; >
Добавление заголовка файла
Область применения:Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
Область применения этого формирования кода:
Что: добавьте заголовки файлов в существующие файлы, проекты и решения с помощью EditorConfig.
Когда: вы хотите легко добавить заголовок файла в файлы, проекты и решения.
Почему: ваша команда требует, чтобы вы включили заголовок файла для целей авторских прав.
Практические советы

- Добавьте EditorConfig в проект или решение, если вы не сделали этого раньше.
- Добавьте правило file_header_template в файл EditorConfig.
- Задайте правилу значение, соответствующее тексту заголовка, который требуется добавить. В качестве заполнителя для имени файла можно использовать .
Примечание. В EditorConfig нельзя явным образом указать несколько строк. Для добавления отдельных строк необходимо использовать символ новой строки, применяемый в системах Unix.


См. также
- Создание кода
- Просмотр изменений
Как создать заголовочный файл в Visual Studio?
Вот хочу создать например небольшую библиотеку для часто используемых «кусков» кода.
Толковую информацию по этому поводу что-то не нашел.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как создать exe файл в C++ Visual Studio 6.0
Начал изучение C++ Visual Studio 6.0 (dev C++ не понравилась) Создал проект, написал код.
Создать заголовочный файл к коду
о созданию хедер файла к следующей программе : Добавлено через 16 секунд #include "mmmap.h".
Как создать круглую кнопку в Visual Studio
Всем привет. Подскажите как сделать круглую кнопку и круглый светодиод и при этом кнопка должна еще.
7624 / 6436 / 2935
Регистрация: 14.04.2014
Сообщений: 28,058
Project -> Add New Item. Там выбираешь h или cpp.
Регистрация: 01.05.2017
Сообщений: 144
а из существующего кода можно создать заголовочный файл хоть как-нибудь? только не врукопашную, а автоматически. кнопку нажать и всё. или возможно как-то .cpp файлы с по-другому подключать?
Регистрация: 24.07.2018
Сообщений: 8
Проект -> Добавить -> Существующий элемент.
Регистрация: 01.05.2017
Сообщений: 144
может программки какие-нибудь есть?
![]()
8737 / 4315 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
Сообщение от Photofenix 
Вот хочу создать например небольшую библиотеку для часто используемых «кусков» кода.
я обычные txt создаю на диске. и втыкиваю в них фрагменты.
по итогу, моя годная супер-пупер библиотека имеет вид:
сэмплы |--- всякий хлам |--- мусор |--- старое `-- новое
Сообщение от большой ДЕН 
из существующего кода можно создать заголовочный файл хоть как-нибудь?
теперь тоже самое, только с толком, с расстановкой.
Регистрация: 01.05.2017
Сообщений: 144
Сообщение от hoggy 
теперь тоже самое, только с толком, с расстановкой
есть .cpp файл и там много функций. чтобы ничего не мешало. хочу расскидать это по отдельным .cpp файлам и подключать когда нужно будет. и тут вопрос, как создать заголовочный файл автоматически. ну не руками же прототипы функций копировать. + если будут изменения в коде — нажал на кнопку и заголовочный файл тоже обновился
Как создать заголовочный файл c visual studio
Если программа содержит много кода, то более оптимально было бы разнести отдельные части кода по отдельным файлам. Например, одни функции могут храниться в одном файле исходного кода, другие функции — в другом файле.
Например, определим файл sum.cpp , который будет иметь следующий код:
int sum(int a, int b)
Это функция вычисления суммы чисел.
Добавим еще один файл — , который будет содержать объявление функции sum:
int sum(int, int);
И также определим главный файл, который назовем app.cpp :
#include #include "sum.h" // подключаем файл sum.h int main() < int result < sum(5, 4)>; std::cout #include "sum.h"
Файл sum.h еще называется заголовочным файлом (header file), так как содержит объявление, заголовок функции. ПРичем в данном случае предполагается что все файлы располагаются в одном каталоге:

Можно было бы и не подключать файл sum.h и вообще не создавать его, а объявление функции поместить непосредственно в файл app.cpp. Но при изменении функции может потребоваться изменить и ее объявление. И если функция sum используется в нескольких файлах с исходным кодом, то в каждом из этих файлов придется менять ее объявление. В данном же случае достаточно изменить объявление функции в одном файле — sum.h.
При компиляции через g++ необходимо передать все файлы через пробел компилятору:
g++ app.cpp sum.cpp -o app
То же самое верно и для компиляции через Clang::
clang++ app.cpp sum.cpp -o app.exe
На выходе будет сгенерирован единый файл app.
При работе в Visual Studio заголовочные файлы обычны помещаются в каталог «Headers»:

А при компиляции все файлы автоматически компилируются в один.
