Последнее обновление: 26 Feb, 2026

Заголовок - .h vs .hpp: В чём разница и какой использовать?

При написании программ на C++, особенно в крупных проектах, организация кода в несколько файлов необходима для читаемости и поддержки. Обычно это делается с помощью заголовочных файлов, которые имеют расширения .h или .hpp. Но в чём разница между ними и какой из них следует использовать?

В этой статье мы разберём различия между файлами .h и .hpp, изучим их историю и дадим рекомендации по лучшим практикам.

Понимание заголовочных файлов в C++

Заголовочные файлы содержат объявления функций, классов, констант и макросов, которые можно включать в несколько исходных файлов. Эти файлы затем включаются в файлы .cpp (исходники C++) с помощью директивы #include.

Обычное содержание заголовочных файлов

  • Определения классов
  • Объявления функций
  • Определения констант
  • Макросы
  • Шаблоны (в некоторых случаях)

Файлы .h

Что такое файл .h?

.h — традиционные заголовочные файлы, впервые широко использованные в языке C. Они продолжают использоваться как в проектах на C, так и на C++ для объявления интерфейсов.

Пример использования:

// mathutils.h
#ifndef MATHUTILS_H
#define MATHUTILS_H

int add(int a, int b);
int subtract(int a, int b);

#endif

Плюсы:

  • Универсально распознаются (используются и в C, и в C++).
  • Подходят для проектов, включающих как код на C, так и на C++.

Минусы:

  • Может вызывать неоднозначность в проектах C++ относительно того, является ли файл C‑стилем или C++‑стилем.

Файлы .hpp

Что такое файл .hpp?

.hpp — заголовочные файлы, специфичные для C++. Они работают так же, как файлы .h, но явно указывают, что заголовок предназначен для кода C++.

Пример использования:

// vectorutils.hpp
#ifndef VECTORUTILS_HPP
#define VECTORUTILS_HPP

#include <vector>

std::vector<int> filter_even(const std::vector<int>& input);

#endif

Плюсы:

  • Чётко указывает, что файл предназначен для C++.
  • Избегает путаницы при смешивании C и C++.
  • Полезно в проектах с несколькими языками или в командах, придерживающихся строгих правил именования.

Минусы:

  • Немного реже встречается в старых кодовых базах.
  • Не поддерживается некоторыми устаревшими системами, ожидающими расширение .h.

.h vs .hpp: Ключевые различия

ОсобенностьФайл .hФайл .hpp
Языковая привязкаC и C++Только C++
Конвенция или правило?КонвенцияКонвенция
Использование в проектах C++РаспространеноПредпочтительно для некоторых из соображений ясности
Поддержка шаблоновДаДа
Неоднозначность кодаВозможна в проектах с несколькими языкамиМенее вероятно

Лучшие практики выбора между .h и .hpp

Используйте .h, если:

  • Вы пишете код, который должен быть совместим как с C, так и с C++.
  • Вы поддерживаете или расширяете наследованный код, уже использующий .h.

Используйте .hpp, если:

  • Вы хотите явно указать, что файл предназначен только для C++.
  • Вы работаете в проекте, использующем исключительно C++ или применяете специфичные для C++ возможности, такие как классы, шаблоны и пространства имён.

Общие структуры проекта

Пример с .h:

project/
├── main.cpp
├── mathutils.h
└── mathutils.cpp

Пример с .hpp:

project/
├── main.cpp
├── vectorutils.hpp
└── vectorutils.cpp

Обе структуры допустимы; различие в основном связано с ясностью и предпочтениями команды.

Заключение

Выбор между .h и .hpp в основном вопрос конвенции, а не функциональности. Оба типа служат одной цели: объявлять интерфейсы и общий код для множества файлов‑исходников C++.

Тем не менее, для кода, специфичного к C++, использование .hpp может сделать ваши намерения более очевидными и помочь избежать путаницы в больших кодовых базах — особенно в проектах, включающих несколько языков. Для проектов с смешанными языками или наследованных кодовых баз .h всё ещё может быть предпочтительным вариантом.

Ключевой вывод:

Используйте .hpp, когда хотите явно указать «это только код C++» — оставайтесь с .h, если работаете в средах, где смешиваются C и C++.

Смотрите также