Я использую .hpp, потому что хочу, чтобы пользователь различал заголовки C ++ и заголовки C.
Это может быть важно, когда ваш проект использует модули как C, так и C ++: как кто-то другой объяснил до меня, вы должны делать это очень осторожно, и все начинается с «контракта», который вы предлагаете через расширение
.hpp: заголовки C ++
(Или .hxx, или .hh, или как там)
Этот заголовок только для C ++.
Если вы находитесь в модуле C, даже не пытайтесь включить его. Вам это не понравится, потому что не делается никаких усилий, чтобы сделать его C-дружественным (слишком много будет потеряно, например, перегрузка функций, пространства имен и т. Д. И т. Д.).
.h: C / C ++ совместимые или чистые заголовки C
Этот заголовок может быть включен как источником C, так и источником C ++, прямо или косвенно.
Может быть включен напрямую, будучи защищенным __cplusplus
макросом:
- Это означает, что с точки зрения C ++ C-совместимый код будет определен как
extern "C"
.
- С точки зрения C весь код C будет отчетливо виден, но код C ++ будет скрыт (потому что он не будет компилироваться в компиляторе C).
Например:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Или же он может быть косвенно включен в соответствующий заголовок .hpp, содержащий его вместе с extern "C"
объявлением.
Например:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
а также:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
Я всегда считал
.hpp
заголовок своего рода portmanteau.h
и.cpp
файлами ... заголовком, который также содержит детали реализации.Обычно, когда я видел (и использую)
.hpp
в качестве расширения, соответствующего.cpp
файла нет. Как уже говорили другие, это не жесткое и быстрое правило, только то, как я склонен использовать.hpp
файлы.источник
Неважно, какое расширение вы используете. Либо один в порядке.
Я использую
*.h
для C и*.hpp
для C ++.источник
РЕДАКТИРОВАТЬ [Добавлено предложение от Дана Ниссенбаума]:
Согласно одному соглашению, файлы .hpp используются, когда прототипы определены в самом заголовке. Такие определения в заголовках полезны в случае шаблонов, поскольку компилятор генерирует код для каждого типа только при создании экземпляра шаблона. Следовательно, если они не определены в заголовочных файлах, их определения не будут разрешены во время компоновки из других модулей компиляции. Если ваш проект является проектом только на C ++, в котором интенсивно используются шаблоны, это соглашение будет полезно.
Некоторые библиотеки шаблонов, которые придерживаются этого соглашения, предоставляют заголовкам расширения .hpp, чтобы указать, что у них нет соответствующих файлов .cpp.
другое соглашение - использовать .h для заголовков C и .hpp для C ++; хорошим примером будет библиотека повышения.
источник
Я недавно начал использовать
*.hpp
для заголовков c ++.Причина в том, что я использую emacs в качестве основного редактора, и он автоматически входит в c-режим, когда вы загружаете
*.h
файл, и в c ++ - режим, когда вы загружаете*.hpp
файл.Помимо тот факт , я не вижу никаких веских причин для выбора
*.h
более*.hpp
или наоборот.источник
Я отвечаю на это как напоминание, чтобы указать на мой комментарий (я) к "user1949346" ответ на этот же ОП.
Так что многие уже ответили: в любом случае это хорошо. Далее следуют акценты своих впечатлений.
Вводный, как и в предыдущих названных комментариях, я считаю, что
C++
расширение заголовков предлагается,.h
если на самом деле нет причин против этого.Поскольку в документах ИСО / МЭК используется это обозначение файлов заголовков, и
.hpp
в их языковой документации о совпадении строк даже не встречаетсяC++
.Но сейчас я стремлюсь по приемлемой причине, ПОЧЕМУ любой путь в порядке, и особенно почему он не зависит от языка, на котором он сам.
Итак, поехали.
C++
Документация (я на самом деле принимаю ссылку от версии N3690) определяет , что заголовок должен соответствовать следующему синтаксису:Таким образом, как мы можем извлечь из этой части, имя файла заголовка также может быть любым, допустимым в исходном коде. За исключением того, что содержит
'\n'
символы и в зависимости от того, должен ли он быть включен,<>
ему не разрешено содержать>
. Или другой способ, если он включен в""
-include, он не может содержать"
.Другими словами: если у вас была среда, поддерживающая такие имена файлов, как
prettyStupidIdea.>
include:будет действительным, но:
будет недействительным. И наоборот.
И даже
будет допустимым включаемым именем файла заголовка.
Даже это соответствовало бы
C++
, это была бы довольно глупая идея, хотя.И поэтому
.hpp
тоже действует.Но это не результат комитетов, разрабатывающих решения для языка!
Поэтому обсуждение собирается использовать
.hpp
такое же , как делает это о том.cc
,.mm
или что - либо еще , что я читал в других сообщениях на эту тему.Я должен признать, что понятия не имею, откуда
.hpp
взялся 1 , но я бы поспорил, что изобретатель какого-то инструмента синтаксического анализа, IDE или чего-то еще, связанного с этим,C++
пришел к этой идее, чтобы оптимизировать некоторые внутренние процессы или просто изобрести некоторые (возможно, даже для них обязательно ) новые соглашения об именах.Но это не часть языка.
И всякий раз, когда кто-то решает использовать это таким образом. Может быть потому , что ему нравится не больше всего или потому , что некоторые приложения процесса требуют, он никогда 2 является требованием языка. Поэтому тот, кто говорит «pp - это потому, что он используется с C ++», просто ошибается в отношении определения языков.
C ++ позволяет все, что касается предыдущего абзаца. И если есть что-то, что комитет предложил использовать, то он использует,
.h
поскольку это расширение используется во всех примерах документа ISO.Вывод:
Пока вы не видите / не чувствуете необходимости использовать
.h
сверх.hpp
или наоборот, вам не стоит беспокоиться. Потому что оба будут формировать правильное имя заголовка одинакового качества по отношению к стандарту. И поэтому все, что ТРЕБУЕТ вас использовать.h
или.hpp
является дополнительным ограничением стандарта, которое может даже противоречить другим дополнительным ограничениям, не соответствующим друг другу. Но поскольку OP не упоминает никаких дополнительных языковых ограничений, это единственный правильный и приемлемый ответ на вопрос« * .h или * .hpp для ваших определений классов »:
И то, и другое одинаково правильно и применимо, если нет внешних ограничений.
1 Из того, что я знаю, по-видимому, это расширение Boost, которое придумало это
.hpp
расширение.2 Конечно, я не могу сказать, что принесут с собой некоторые будущие версии!
источник
Я предпочитаю .hpp для C ++, чтобы дать понять обоим редакторам и другим программистам, что это заголовок C ++, а не файл заголовка C.
источник
C ++ («C Plus Plus») имеет смысл как .cpp
Наличие заголовочных файлов с расширением .hpp не имеет такого же логического потока.
источник
Вы можете называть свои списки как угодно.
Просто нужно указать это полное имя в
#include
.Я предлагаю это, если вы работаете с C для использования
.h
и когда с C ++ для использования.hpp
.В конце концов, это просто соглашение.
источник
Codegear C ++ Builder использует .hpp для файлов заголовков, автоматически сгенерированных из исходных файлов Delphi, и файлов .h для ваших «собственных» файлов заголовков.
Поэтому, когда я пишу заголовочный файл C ++, я всегда использую .h.
источник
На одной из моих работ в начале 90-х мы использовали .cc и .hh для исходного и заголовочного файлов соответственно. Я все еще предпочитаю это всем альтернативам, вероятно, потому что это легче всего напечатать.
источник
Бьярн Страуструп и Херб Саттер высказывают свое мнение по этому вопросу в своих основных рекомендациях по C ++, которые можно найти по адресу : https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source, в которых также упоминаются последние изменения. в стандартном расширении (C ++ 11, C ++ 14 и т. д.)
Я не большой поклонник этого соглашения, потому что если вы используете популярную библиотеку, такую как boost, ваша согласованность уже нарушена, и вам лучше использовать .hpp.
источник
Как многие здесь уже упоминали, я также предпочитаю использовать .hpp для библиотек только для заголовков, которые используют шаблоны классов / функций. Я предпочитаю использовать .h для заголовочных файлов, сопровождаемых исходными файлами .cpp или общими или статическими библиотеками.
Большинство библиотек, которые я разрабатываю, основаны на шаблонах и поэтому должны быть только заголовками, но при написании приложений я стремлюсь отделить объявление от реализации и в конечном итоге получить файлы .h и .cpp.
источник
К счастью, это просто.
Вы должны использовать расширение .hpp, если вы работаете с C ++, и вы должны использовать .h для C или для смешивания C и C ++.
источник
Я использую .h, потому что это то, что использует Microsoft, и что создает их генератор кода. Не надо идти против зерна.
источник
В "Языке программирования C ++, третье издание Бьярна Страуструпа", обязательной для чтения книге C ++ № 1, он использует * .h. Поэтому я предполагаю, что лучшая практика - использовать * .h.
Тем не менее, * .hpp тоже хорошо!
источник
.hpp
этом.Инструментам и людям легко что-то отличить . Вот и все.
При обычном использовании (с помощью boost и т. Д.), В
.hpp
частности, используются заголовки C ++. С другой стороны,.h
для не-C ++ - только заголовки (в основном C). Точно определить язык контента, как правило, сложно, поскольку существует много нетривиальных случаев, поэтому такое различие часто делает готовым к использованию инструмент простым в написании. Для людей, однажды получив соглашение, это также легко запомнить и легко использовать.Однако я хотел бы отметить, что сама конвенция не всегда работает, как ожидалось.
.hpp
Сам по себе не единственный выбор. Почему нет.hh
или.hxx
? (Хотя в любом случае вам обычно требуется хотя бы одно обычное правило относительно имен файлов и путей.)Я лично использую оба
.h
и.hpp
в моих проектах C ++. Я не соблюдаю соглашение выше, потому что:.h
файлов на github.com. (В комментариях может быть что-то вроде shebang, чтобы эти исходные файлы были лучшими метаданными, но это даже не является общепринятым, как имена файлов, поэтому в целом не надежно.)Я обычно использую
.hpp
заголовки на C ++, и заголовки должны использоваться (поддерживаться) только для заголовков , например, как библиотеки шаблонов. Для других заголовков.h
либо существует соответствующий.cpp
файл в качестве реализации, либо это не заголовок C ++. Последнее тривиально для различения содержимого заголовка людьми (или инструментами с явными встроенными метаданными, если необходимо).источник
Расширение исходного файла может иметь значение для вашей системы сборки, к примеру, вы могли бы иметь правила в вашем Makefile для
.cpp
или.c
файлов, или ваш компилятор (например , Microsoftcl.exe
) может скомпилировать файл как C или C ++ в зависимости от расширения.Поскольку вы должны указать
#include
директиву целиком , расширение файла заголовка не имеет значения. Вы можете включить.c
файл в другой исходный файл, если хотите, потому что это просто текстовое включение. У вашего компилятора может быть возможность вывести предварительно обработанный вывод, который прояснит это (Microsoft:/P
предварительная обработка в файл,/E
предварительная обработкаstdout
,/EP
пропуск#line
директив,/C
сохранение комментариев)Вы можете использовать
.hpp
файлы, относящиеся только к среде C ++, т.е. они используют функции, которые не компилируются в C.источник
Нет никакого преимущества для какого-либо конкретного расширения, кроме того, что оно может иметь другое значение для вас, компилятора и / или ваших инструментов.
header.h
является действительным заголовком.header.hpp
является действительным заголовком.header.hh
является действительным заголовком.header.hx
является действительным заголовком.h.header
является действительным заголовком.this.is.not.a.valid.header
является действительным заголовком в отказе.ihjkflajfajfklaf
является действительным заголовком. Пока имя может быть правильно проанализировано компилятором и файловая система поддерживает его, это допустимый заголовок, и единственным преимуществом его расширения является то, что в него читается.Это значит , что возможность точно делать предположения на основе расширения очень полезна, поэтому было бы разумно использовать легко понятный набор правил для ваших заголовочных файлов. Лично я предпочитаю делать что-то вроде этого:
.h
. Там нет двусмысленности..h
, в то время как заголовок совместим с C ++ , но не C получает.hpp
или.hh
или что - то в этом роде.Это, конечно, всего лишь один из многих способов обработки расширений, и вы не обязательно можете доверять своему первому впечатлению, даже если все кажется простым. Например, я видел упоминание об использовании
.h
для обычных заголовков и.tpp
для заголовков, которые содержат только определения для шаблонных функций-членов класса, с.h
файлами, которые определяют шаблонные классы, включая.tpp
файлы, которые определяют их функции-члены (вместо.h
заголовка, непосредственно содержащего оба объявление функции и определение). В качестве другого примера, многие люди всегда отражают язык заголовка в его расширении, даже если нет никакой вероятности двусмысленности; для них.h
всегда заголовок C и.hpp
(или.hh
, или.hxx
и т. д.) всегда является заголовком C ++. И еще раз, некоторые люди используют.h
для «заголовка, связанного с исходным файлом» и.hpp
для «заголовка со всеми встроенными функциями».Учитывая это, главное преимущество будет заключаться в последовательном именовании ваших заголовков в одном стиле и обеспечении того, чтобы этот стиль был легко понятен любому, кто изучает ваш код. Таким образом, любой, кто знаком с вашим обычным стилем кодирования, сможет определить, что вы имеете в виду под любым расширением, просто беглым взглядом.
источник