Uso .hpp porque quero que o usuário diferencie quais cabeçalhos são C ++ e quais são C.
Isso pode ser importante quando o seu projeto estiver usando os módulos C e C ++: Como alguém explicado antes de mim, você deve fazê-lo com muito cuidado e começa com o "contrato" que você oferece através da extensão
.hpp: cabeçalhos C ++
(Ou .hxx, ou .hh, ou o que for)
Este cabeçalho é apenas para C ++.
Se você estiver em um módulo C, nem tente incluí-lo. Você não vai gostar, porque não é feito nenhum esforço para torná-lo compatível com C (muito seria perdido, como sobrecarga de funções, espaços para nome, etc. etc.).
.h: cabeçalhos C puros ou compatíveis com C / C ++
Esse cabeçalho pode ser incluído por uma fonte C e uma fonte C ++, direta ou indiretamente.
Pode ser incluído diretamente, sendo protegido pela __cplusplus
macro:
- O que significa que, do ponto de vista de C ++, o código compatível com C será definido como
extern "C"
.
- Do ponto de vista C, todo o código C estará claramente visível, mas o código C ++ ficará oculto (porque não será compilado em um compilador C).
Por exemplo:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Ou pode ser incluído indiretamente pelo cabeçalho .hpp correspondente, que o inclui com a extern "C"
declaração.
Por exemplo:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
e:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
Eu sempre considerei o
.hpp
cabeçalho uma espécie de portmanteau.h
e.cpp
arquivos ... um cabeçalho que também contém detalhes de implementação.Normalmente, quando vejo (e uso)
.hpp
como uma extensão, não há.cpp
arquivo correspondente . Como já foi dito, essa não é uma regra rígida, exatamente como eu uso.hpp
arquivos.fonte
Não importa qual extensão você usa. Qualquer um está bem.
Eu uso
*.h
para C e*.hpp
para C ++.fonte
EDIT [Adicionado sugestão de Dan Nissenbaum]:
Por uma convenção, os arquivos .hpp são usados quando os protótipos são definidos no próprio cabeçalho. Essas definições nos cabeçalhos são úteis no caso de modelos, pois o compilador gera o código para cada tipo apenas na instanciação do modelo. Portanto, se eles não estiverem definidos nos arquivos de cabeçalho, suas definições não serão resolvidas no momento do link de outras unidades de compilação. Se o seu projeto for apenas em C ++ e fizer uso intenso de modelos, essa convenção será útil.
Certas bibliotecas de modelos que aderem a esta convenção fornecem aos cabeçalhos extensões .hpp para indicar que eles não têm arquivos .cpp correspondentes.
outra convenção é usar .h para cabeçalhos C e .hpp para C ++; Um bom exemplo seria a biblioteca de impulso.
fonte
Recentemente, comecei a usar
*.hpp
para cabeçalhos de c ++.O motivo é que eu uso o emacs como meu editor principal e ele entra automaticamente no modo c quando você carrega um
*.h
arquivo e no modo c ++ - quando você carrega um*.hpp
arquivo.Além desse fato, não vejo boas razões para escolher
*.h
mais*.hpp
ou vice-versa.fonte
Estou respondendo a isso como um lembrete, para citar meus comentários sobre a resposta "user1949346" desse mesmo OP.
Então, como muitos já responderam: de qualquer maneira está bem. Seguido por enfatiza suas próprias impressões.
Introdutório, como também nos comentários nomeados anteriores declarados, minha opinião é que as
C++
extensões de cabeçalho são propostas,.h
caso não haja realmente nenhuma razão contra isso.Como os documentos ISO / IEC usam essa notação de arquivos de cabeçalho e nenhuma correspondência de string
.hpp
ocorre mesmo nas documentações de idiomas delesC++
.Mas agora estou buscando uma razão aprovável PORQUE de qualquer maneira está ok, e especialmente porque não é assunto da linguagem em si.
Aqui vamos nos.
A
C++
documentação (na verdade, estou tomando referência da versão N3690) define que um cabeçalho deve estar em conformidade com a seguinte sintaxe:Portanto, como podemos extrair desta parte, o nome do arquivo de cabeçalho também pode ser válido no código-fonte. Exceto por conter
'\n'
caracteres e, dependendo se ele deve ser incluído,<>
não é permitido que contenha a>
. Ou, caso contrário, se for incluído por""
-include, não será permitido conter a"
.Em outras palavras: se você tinha um ambiente que suporta nomes de arquivos como
prettyStupidIdea.>
, inclua:seria válido, mas:
seria inválido. O contrário é o mesmo.
E até mesmo
seria um nome de arquivo de cabeçalho inclusivo válido.
Mesmo isso seria conforme
C++
, seria uma idéia muito estúpida, tho.E é por isso que também
.hpp
é válido.Mas não é um resultado dos comitês que elaboram decisões para o idioma!
Portanto, discutir sobre o uso
.hpp
é o mesmo que fazê-lo.cc
,.mm
ou o que mais eu li em outros posts sobre esse tópico.Eu tenho que admitir que não tenho idéia de onde
.hpp
veio 1 , mas eu apostaria que um inventor de alguma ferramenta de análise, IDE ou outra coisa preocupadaC++
chegou a essa idéia para otimizar alguns processos internos ou apenas para inventar alguns (provavelmente mesmo para eles necessariamente ) novas convenções de nomenclatura.Mas isso não faz parte do idioma.
E sempre que alguém decide usá-lo dessa maneira. Pode ser que ele goste mais ou porque algumas aplicações do fluxo de trabalho exijam, nunca 2 é um requisito da linguagem. Portanto, quem diz que "o pp é porque é usado com C ++" simplesmente está errado em relação à definição de linguagens.
C ++ permite qualquer coisa que respeite o parágrafo anterior. E se houver algo que o comitê se proponha a usar, ele será usado,
.h
pois essa é a extensão processada em todos os exemplos do documento ISO.Conclusão:
Contanto que você não veja / sinta nenhuma necessidade de usar
.h
over.hpp
ou vice-versa, não deve se preocupar. Porque ambos formariam um nome de cabeçalho válido com a mesma qualidade em relação ao padrão. E, portanto, qualquer coisa que EXIGE que você use.h
ou.hpp
é uma restrição adicional do padrão que pode até estar em contradição com outras restrições adicionais que não estão em conformidade. Mas como o OP não menciona nenhuma restrição adicional de idioma, esta é a única resposta correta e aprovada para a pergunta" * .h ou * .hpp para suas definições de classe " é:
Ambos são igualmente corretos e aplicáveis, desde que não haja restrições externas.
1 Pelo que sei, aparentemente, é a estrutura de impulso que surgiu com essa
.hpp
extensão.2 É claro que não posso dizer o que algumas versões futuras trarão com ele!
fonte
Eu prefiro .hpp para C ++ para deixar claro para os editores e para outros programadores que é um cabeçalho C ++ em vez de um arquivo de cabeçalho C.
fonte
C ++ ("C Plus Plus") faz sentido como .cpp
Ter arquivos de cabeçalho com extensão .hpp não tem o mesmo fluxo lógico.
fonte
Você pode ligar para suas inclusões como quiser.
Só precisa especificar esse nome completo no
#include
.Sugiro que, se você trabalha com C para usar
.h
e quando estiver usando C ++.hpp
.É no final apenas uma convenção.
fonte
O Codegear C ++ Builder usa .hpp para arquivos de cabeçalho gerados automaticamente a partir de arquivos de origem Delphi e arquivos .h para seus "próprios" arquivos de cabeçalho.
Então, quando estou escrevendo um arquivo de cabeçalho C ++, sempre uso .h.
fonte
Em um dos meus trabalhos no início dos anos 90, usamos .cc e .hh para arquivos de origem e cabeçalho, respectivamente. Eu ainda prefiro isso entre todas as alternativas, provavelmente porque é mais fácil digitar.
fonte
Bjarne Stroustrup e Herb Sutter têm uma declaração para esta pergunta em suas diretrizes principais do C ++, encontradas em: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source, que também se refere às alterações mais recentes na extensão padrão (C ++ 11, C ++ 14, etc.)
Eu não sou um grande fã desta convenção, porque se você estiver usando uma biblioteca popular como o boost, sua consistência já está quebrada e você deve usar melhor o .hpp.
fonte
Como muitos aqui já mencionaram, também prefiro usar .hpp para bibliotecas somente de cabeçalho que usam classes / funções de modelo. Prefiro usar .h para arquivos de cabeçalho acompanhados por arquivos de origem .cpp ou bibliotecas compartilhadas ou estáticas.
A maioria das bibliotecas que desenvolvo são baseadas em modelos e, portanto, precisam ser apenas de cabeçalho, mas ao escrever aplicativos, costumo separar a declaração da implementação e acabar com os arquivos .h e .cpp
fonte
Felizmente, é simples.
Você deve usar a extensão .hpp se estiver trabalhando com C ++ e deve usar .h para C ou misturar C e C ++.
fonte
Eu uso .h porque é isso que a Microsoft usa e o que seu gerador de código cria. Não há necessidade de ir contra a corrente.
fonte
Em "A linguagem de programação C ++, terceira edição de Bjarne Stroustrup", o livro C ++ de leitura obrigatória nº1, ele usa * .h. Portanto, presumo que a melhor prática seja usar * .h.
No entanto, * .hpp também é bom!
fonte
.hpp
à própria linguagem.É fácil para ferramentas e humanos diferenciarem algo . É isso aí.
No uso convencional (por impulso, etc),
.hpp
são especificamente cabeçalhos de C ++. Por outro lado,.h
é para cabeçalhos não C ++ - apenas (principalmente C). Detectar com precisão o idioma do conteúdo geralmente é difícil, uma vez que existem muitos casos não triviais, portanto essa diferença geralmente facilita a gravação de uma ferramenta pronta para uso. Para os seres humanos, depois de obter a convenção, também é fácil de lembrar e fácil de usar.No entanto, gostaria de salientar que a convenção em si nem sempre funciona, como esperado.
.hpp
em si não é a única escolha. Por que não.hh
ou.hxx
? (De qualquer forma, você geralmente precisa de pelo menos uma regra convencional sobre nomes de arquivos e caminhos.)Eu pessoalmente uso os dois
.h
e.hpp
nos meus projetos C ++. Não sigo a convenção acima porque:.h
arquivos no github.com. (Pode haver algo nos comentários, como shebang, para que esses arquivos de origem sejam melhores metadados, mas nem mesmo é convencional como nomes de arquivos, portanto, também não é confiável em geral.)Eu costumo usar
.hpp
em cabeçalhos C ++ e os cabeçalhos devem ser usados (mantidos) de maneira somente cabeçalho , por exemplo, como bibliotecas de modelos. Para outros cabeçalhos.h
, existe um.cpp
arquivo correspondente como implementação ou é um cabeçalho não C ++. O último é trivial de se diferenciar pelo conteúdo do cabeçalho por humanos (ou por ferramentas com metadados explícitos incorporados, se necessário).fonte
A extensão do arquivo de origem pode ter significado para o seu sistema de compilação, por exemplo, você pode ter uma regra em seu makefile para
.cpp
ou.c
arquivos, ou seu compilador (por exemplo, Microsoftcl.exe
) pode compilar o arquivo como C ou C ++, dependendo da extensão.Como você precisa fornecer o nome do arquivo inteiro para a
#include
diretiva, a extensão do arquivo de cabeçalho é irrelevante. Você pode incluir um.c
arquivo em outro arquivo de origem, se quiser, porque é apenas uma inclusão textual. Seu compilador pode ter uma opção para despejar a saída pré-processada que tornará isso claro (Microsoft:/P
para pré-processar para arquivar,/E
para pré-processar parastdout
,/EP
para omitir#line
diretivas,/C
para reter comentários)Você pode optar por usar
.hpp
arquivos relevantes apenas para o ambiente C ++, ou seja, eles usam recursos que não serão compilados em C.fonte
Não há vantagem em nenhuma extensão específica, exceto aquela que pode ter um significado diferente para você, o compilador e / ou suas ferramentas.
header.h
é um cabeçalho válido.header.hpp
é um cabeçalho válido.header.hh
é um cabeçalho válido.header.hx
é um cabeçalho válido.h.header
é um cabeçalho válido.this.is.not.a.valid.header
é um cabeçalho válido em negação.ihjkflajfajfklaf
é um cabeçalho válido. Contanto que o nome possa ser analisado corretamente pelo compilador e o sistema de arquivos o suporte, é um cabeçalho válido, e a única vantagem de sua extensão é o que se lê nele.Dito isto, ser capaz de fazer suposições precisas com base na extensão é muito útil, portanto, seria aconselhável usar um conjunto de regras de fácil compreensão para os arquivos de cabeçalho. Pessoalmente, prefiro fazer algo assim:
.h
. Não há ambiguidade..h
, enquanto um cabeçalho compatível com C ++, mas não C recebe.hpp
ou.hh
ou algo do tipo.É claro que essa é apenas uma das muitas maneiras de lidar com extensões, e você não pode necessariamente confiar na sua primeira impressão, mesmo que as coisas pareçam simples. Por exemplo, vi menção de uso
.h
para cabeçalhos normais e.tpp
para cabeçalhos que contêm apenas definições para funções de membro de classe com modelo, com.h
arquivos que definem classes com modelo, incluindo os.tpp
arquivos que definem suas funções de membro (em vez do.h
cabeçalho que contém diretamente os declaração de função e definição). Por outro exemplo, muitas pessoas sempre refletem o idioma do cabeçalho em sua extensão, mesmo quando não há chance de ambiguidade; para eles,.h
sempre é um cabeçalho C e.hpp
(ou.hh
, ou.hxx
, etc.) é sempre um cabeçalho C ++. E mais uma vez, algumas pessoas usam.h
para "cabeçalho associado a um arquivo de origem" e.hpp
"cabeçalho com todas as funções definidas em linha".Considerando isso, a principal vantagem seria nomear seus cabeçalhos de maneira consistente no mesmo estilo e tornar esse estilo facilmente aparente para qualquer pessoa que examinasse seu código. Dessa forma, qualquer pessoa familiarizada com o seu estilo de codificação usual poderá determinar o que você quer dizer com qualquer extensão com apenas um olhar superficial.
fonte