* .h или * .hpp для ваших определений классов - PullRequest
477 голосов
/ 30 сентября 2008

Я всегда использовал *.h файл для своих определений классов, но прочитав некоторый код расширенной библиотеки, я понял, что все они используют *.hpp. У меня всегда было отвращение к этому расширению файла, я думаю, в основном потому, что я к этому не привык.

Каковы преимущества и недостатки использования *.hpp перед *.h?

Ответы [ 20 ]

466 голосов
/ 30 сентября 2008

Вот несколько причин для различного именования заголовков C и C ++:

  • Автоматическое форматирование кода, у вас могут быть разные рекомендации по форматированию кода C и C ++. Если заголовки разделены расширением, вы можете настроить свой редактор на автоматическое применение соответствующего форматирования
  • Именование, я был в проектах, где были библиотеки, написанные на C, а затем в C ++ были реализованы оболочки. Поскольку заголовки обычно имели схожие имена, то есть Feature.h против Feature.hpp, их было легко отличить друг от друга.
  • Включение, возможно, у вашего проекта есть более подходящие версии, написанные на C ++, но вы используете версию C (см. Пункт выше). Если заголовки названы в соответствии с языком, на котором они реализованы, вы можете легко обнаружить все заголовки C и проверить наличие версий C ++.

Помните, C - это , а не C ++, и смешивать и сопоставлять может быть очень опасно, если вы не знаете, что делаете. Правильное присвоение имен источникам поможет вам отличить языки.

210 голосов
/ 30 сентября 2008

Я использую .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
46 голосов
/ 30 сентября 2008

Я всегда считал заголовок .hpp своего рода portmanteau из файлов .h и .cpp ... заголовка, который также содержит детали реализации.

Обычно, когда я видел (и использую) .hpp в качестве расширения, соответствующий файл .cpp не существует. Как уже говорили другие, это не жесткое и быстрое правило, только то, как я склонен использовать .hpp файлы.

26 голосов
/ 30 сентября 2008

Неважно, какое расширение вы используете. Либо один в порядке.

Я использую *.h для C и *.hpp для C ++.

21 голосов
/ 03 декабря 2013

РЕДАКТИРОВАТЬ [Добавлено предложение от Дана Ниссенбаума]:

Согласно одному соглашению, файлы .hpp используются, когда прототипы определены в самом заголовке. Такие определения в заголовках полезны в случае шаблонов, поскольку компилятор генерирует код для каждого типа только при создании экземпляра шаблона. Следовательно, если они не определены в заголовочных файлах, их определения не будут разрешены во время компоновки из других модулей компиляции. Если ваш проект является проектом только на C ++ и интенсивно использует шаблоны, это соглашение может быть полезным.

Некоторые библиотеки шаблонов, которые придерживаются этого соглашения, предоставляют заголовкам расширения .hpp, чтобы указать, что у них нет соответствующих файлов .cpp.

Некоторые другие библиотеки шаблонов используют другое соглашение, например, использование .h для заголовков C и .hpp для C ++; хорошим примером будет библиотека наддува.

Цитата из Boost FAQ,

Расширения файлов сообщают «тип» файла обоим людям и компьютерным программам. Расширение .h используется для заголовка C файлы, и, следовательно, сообщает неправильно о заголовке C ++ файлы. Использование без расширения ничего не сообщает и требует проверки содержимого файла, чтобы определить тип. Использование .hpp однозначно идентифицирует его как заголовочный файл C ++ и хорошо работает на практике. (Райнер Дейке)

10 голосов
/ 30 сентября 2008

Я недавно начал использовать *.hpp для заголовков c ++.

Причина в том, что я использую emacs в качестве основного редактора, и он автоматически входит в c-режим при загрузке файла *.h и в c ++ - режим при загрузке файла *.hpp.

Помимо этого факта я не вижу веских причин для выбора *.h вместо *.hpp или наоборот.

8 голосов
/ 08 марта 2016

Я отвечаю на это как напоминание, чтобы указать на мой комментарий (и) к "user1949346" ответу на тот же самый ОП.


Так что многие уже ответили: в любом случае это хорошо. Далее следуют акценты своих впечатлений.

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

Поскольку в документах ИСО / МЭК используется это обозначение заголовочных файлов, и в их языковой документации о C++.

даже не встречается строка, соответствующая .hpp.

Но сейчас я стремлюсь по приемлемой причине, ПОЧЕМУ любой из способов в порядке, и особенно почему он не подчиняется самому языку.

Итак, поехали.

Документация C++ (на самом деле я ссылаюсь на версию N3690) определяет, что заголовок должен соответствовать следующему синтаксису:

2.9 Имена заголовков

header-name:
    < h-char-sequence >
    " q-char-sequence "
h-char-sequence:
    h-char
    h-char-sequence h-char
h-char:
    any member of the source character set except new-line and >
q-char-sequence:
    q-char
    q-char-sequence q-char
q-char:
    any member of the source character set except new-line and "

Таким образом, как мы можем извлечь из этой части, имя файла заголовка также может быть любым, допустимым в исходном коде. За исключением того, что содержит '\n' символов и в зависимости от того, должно ли оно быть включено в <>, оно не может содержать >. Или другой способ, если он включен в "" - включается, что он не может содержать ".

Другими словами: если у вас была среда, поддерживающая имена файлов, такие как prettyStupidIdea.>, включайте, например:

#include "prettyStupidIdea.>"

будет действительным, но:

#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 Из того, что я знаю, по-видимому, это фреймворк буста, который придумал это расширение .hpp.

2 Конечно, я не могу сказать, что принесут с собой некоторые будущие версии!

6 голосов
/ 30 сентября 2008

Я предпочитаю .hpp для C ++, чтобы дать понять обоим редакторам и другим программистам, что это заголовок C ++, а не файл заголовка C.

6 голосов
/ 30 сентября 2008

C ++ («C Plus Plus») имеет смысл как .cpp

Наличие заголовочных файлов с расширением .hpp не имеет такого же логического потока.

6 голосов
/ 30 сентября 2008

Вы можете называть свои списки как хотите.

Просто нужно указать это полное имя в #include.

Я предлагаю, чтобы, если вы работаете с C, использовать .h, а когда с C ++ использовать .hpp.

В конце концов, это просто соглашение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...