Używam .hpp, ponieważ chcę, aby użytkownik rozróżniał, które nagłówki są nagłówkami C ++, a które nagłówki to C.
Może to być ważne, gdy twój projekt korzysta zarówno z modułów C, jak i C ++: Jak ktoś wcześniej mi wyjaśnił, powinieneś to zrobić bardzo ostrożnie, a zaczyna się od „umowy”, którą oferujesz poprzez rozszerzenie
.hpp: C ++ Nagłówki
(Lub .hxx lub .hh lub cokolwiek innego)
Ten nagłówek dotyczy tylko C ++.
Jeśli jesteś w module C, nawet nie próbuj go dołączać. Nie spodoba ci się, ponieważ nie podejmuje się żadnych wysiłków, aby uczynić go przyjaznym dla języka C (zbyt wiele by zostało utracone, jak przeciążenie funkcji, przestrzenie nazw itp.).
.h: nagłówki kompatybilne z C / C ++ lub czyste C.
Nagłówek ten może być zawarty zarówno przez źródło C, jak i źródło C ++, bezpośrednio lub pośrednio.
Może zawierać bezpośrednio, chroniony przez __cplusplus
makro:
- Co oznacza, że z punktu widzenia C ++ kod kompatybilny z C zostanie zdefiniowany jako
extern "C"
.
- Z punktu widzenia C cały kod C będzie wyraźnie widoczny, ale kod C ++ będzie ukryty (ponieważ nie skompiluje się w kompilatorze C).
Na przykład:
#ifndef MY_HEADER_H
#define MY_HEADER_H
#ifdef __cplusplus
extern "C"
{
#endif
void myCFunction() ;
#ifdef __cplusplus
} // extern "C"
#endif
#endif // MY_HEADER_H
Lub może być zawarty pośrednio przez odpowiedni nagłówek .hpp załączający go do extern "C"
deklaracji.
Na przykład:
#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP
extern "C"
{
#include "my_header.h"
}
#endif // MY_HEADER_HPP
i:
#ifndef MY_HEADER_H
#define MY_HEADER_H
void myCFunction() ;
#endif // MY_HEADER_H
Zawsze uważałem
.hpp
nagłówek za rodzaj portmanteau.h
i.cpp
plików ... nagłówek, który zawiera również szczegóły implementacji.Zazwyczaj gdy widzę (i używam)
.hpp
jako rozszerzenie, nie ma odpowiedniego.cpp
pliku. Jak powiedzieli inni, nie jest to twarda i szybka reguła, tak jak zwykle używam.hpp
plików.źródło
Nie ma znaczenia, którego rozszerzenia używasz. Każda z nich jest OK.
Używam
*.h
do C i*.hpp
C ++.źródło
EDYCJA [Dodano sugestię Dana Nissenbauma]:
Według jednej konwencji pliki .hpp są używane, gdy prototypy są zdefiniowane w samym nagłówku. Takie definicje w nagłówkach są przydatne w przypadku szablonów, ponieważ kompilator generuje kod dla każdego typu tylko przy tworzeniu szablonu. Dlatego jeśli nie są zdefiniowane w plikach nagłówkowych, ich definicje nie zostaną rozwiązane w czasie łączenia z innymi jednostkami kompilacji. Jeśli twój projekt jest projektem opartym tylko na C ++, który intensywnie wykorzystuje szablony, ta konwencja będzie przydatna.
Niektóre biblioteki szablonów zgodne z tą konwencją udostępniają nagłówkom rozszerzenia .hpp wskazujące, że nie mają odpowiadających im plików .cpp.
inną konwencją jest użycie .h dla nagłówków C i .hpp dla C ++; dobrym przykładem może być biblioteka doładowań.
źródło
Ostatnio zacząłem używać
*.hpp
nagłówków c ++.Powodem jest to, że używam emacsa jako mojego głównego edytora i wchodzi on automatycznie w tryb c po załadowaniu
*.h
pliku oraz w tryb c ++ po załadowaniu*.hpp
pliku.Poza faktem, że nie widzę powodów, biorąc pod uwagę wybierając
*.h
się*.hpp
lub vice versa.źródło
Odpowiadam na to w celu przypomnienia o komentarzach do odpowiedzi „user1949346” na ten sam program operacyjny.
Tak więc wielu już odpowiedziało: tak czy inaczej jest w porządku. Następnie podkreśla własne wrażenia.
Wprowadzenie, tak jak w poprzednich wymienionych nazwanych komentarzach, moja opinia jest taka, że
C++
proponowane są rozszerzenia nagłówków,.h
jeśli tak naprawdę nie ma żadnego powodu.Ponieważ dokumenty ISO / IEC używają tej notacji plików nagłówkowych i nie
.hpp
występuje nawet ciąg pasujący do ich dokumentacji językowejC++
.Ale teraz dążę do akceptowalnego powodu. DLACZEGO którykolwiek z tych sposobów jest w porządku, a zwłaszcza dlaczego nie jest on zależny od języka.
Więc zaczynamy.
C++
Dokumentacja (ja faktycznie biorąc odwołanie od wersji N3690) określa, że nagłówek musi być zgodne z następującą składnią:Tak więc, jak możemy wyodrębnić z tej części, nazwa pliku nagłówka może być dowolną poprawną częścią kodu źródłowego. Z wyjątkiem zawierających
'\n'
znaki i w zależności od tego, czy ma zostać uwzględniony<>
, nie może zawierać znaku>
. Lub w inny sposób, jeśli jest dołączony przez""
-include, nie może zawierać"
.Innymi słowy: jeśli masz środowisko obsługujące nazwy plików
prettyStupidIdea.>
, takie jak:byłoby ważne, ale:
byłby nieważny. Odwrotnie to samo.
I nawet
byłaby poprawną, możliwą do włączenia nazwą pliku nagłówka.
Nawet to byłoby zgodne
C++
, byłby to całkiem głupi pomysł, tho.I dlatego też
.hpp
jest ważny.Ale to nie wynik decyzji komitetów opracowujących decyzje dotyczące języka!
Dyskusja na temat używania
.hpp
jest tym samym, co robienie tego.cc
,.mm
lub o czymkolwiek innym, co czytam w innych postach na ten temat.Muszę przyznać, że nie mam pojęcia, skąd
.hpp
pochodzi 1 , ale założę się, że wynalazca jakiegoś narzędzia do analizy, IDE lub czegoś innego zainteresowanegoC++
wpadł na ten pomysł, aby zoptymalizować niektóre wewnętrzne procesy lub po prostu wymyślić niektóre (prawdopodobnie nawet dla nich koniecznie ) nowe konwencje nazewnictwa.Ale to nie jest część języka.
I ilekroć ktoś decyduje się na to w ten sposób. Może dlatego, że lubi to najbardziej lub ponieważ niektóre aplikacje przepływu pracy tego wymagają, nigdy 2 nie jest wymogiem języka. Więc ktokolwiek powie „pp jest dlatego, że jest używany z C ++”, po prostu się myli w odniesieniu do definicji języków.
C ++ dopuszcza wszystko, co jest zgodne z poprzednim akapitem. A jeśli jest coś, co komitet zaproponował użyć, to używa,
.h
ponieważ jest to rozszerzenie pozwane we wszystkich przykładach dokumentu ISO.Wniosek:
Tak długo, jak nie widzisz / nie odczuwasz potrzeby używania
.h
over.hpp
i vice versa, nie powinieneś się tym przejmować. Ponieważ oba będą stanowić prawidłową nazwę nagłówka o tej samej jakości w stosunku do standardu. A zatem wszystko, co WYMAGA korzystania.h
lub.hpp
stanowi dodatkowe ograniczenie standardu, które może być nawet sprzeczne z innymi dodatkowymi ograniczeniami, które nie są ze sobą zgodne. Ale ponieważ OP nie wspomina o żadnym dodatkowym ograniczeniu językowym, jest to jedyna poprawna i akceptowalna odpowiedź na pytanie„ * .h lub * .hpp dla definicji klas ” to:
Oba są jednakowo poprawne i obowiązują, o ile nie występują żadne ograniczenia zewnętrzne.
1 Z tego, co wiem, najwyraźniej to właśnie ramy doładowań wymyśliły to
.hpp
rozszerzenie.2 Oczywiście nie mogę powiedzieć, co przyniosą niektóre przyszłe wersje!
źródło
Wolę .hpp dla C ++, aby wyjaśnić zarówno redaktorom, jak i innym programistom, że jest to nagłówek C ++, a nie plik nagłówka C.
źródło
C ++ („C Plus Plus”) ma sens jako .cpp
Pliki nagłówkowe z rozszerzeniem .hpp nie mają tego samego logicznego przepływu.
źródło
Możesz nazywać swoje załączniki, jak chcesz.
Wystarczy podać tę pełną nazwę w
#include
.Sugeruję, że jeśli pracujesz z C, aby użyć,
.h
a kiedy z C ++, aby użyć.hpp
.To w końcu tylko konwencja.
źródło
Codegear C ++ Builder używa .hpp do plików nagłówkowych generowanych automatycznie z plików źródłowych Delphi, a .h do własnych plików nagłówkowych.
Kiedy piszę plik nagłówkowy C ++, zawsze używam .h.
źródło
W jednym z moich zadań na początku lat 90. używaliśmy .cc i .hh odpowiednio dla plików źródłowych i nagłówkowych. Nadal wolę to niż wszystkie alternatywy, prawdopodobnie dlatego, że najłatwiej jest pisać.
źródło
Bjarne Stroustrup i Herb Sutter mają oświadczenie na to pytanie w swoich podstawowych wytycznych C ++ na stronie : https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source, który również odnosi się do najnowszych zmian w standardowym rozszerzeniu (C ++ 11, C ++ 14 itd.)
Nie jestem wielkim fanem tej konwencji, ponieważ jeśli używasz popularnej biblioteki, takiej jak boost, twoja spójność jest już zepsuta i powinieneś lepiej użyć .hpp.
źródło
Jak wielu tutaj już wspomniało, wolę także .hpp dla bibliotek tylko nagłówkowych, które używają klas / funkcji szablonów. Wolę używać .h dla plików nagłówkowych, którym towarzyszą pliki źródłowe .cpp lub biblioteki współdzielone lub statyczne.
Większość bibliotek, które tworzę, są oparte na szablonach i dlatego muszą być tylko nagłówkami, ale podczas pisania aplikacji zwykle oddzielam deklarację od implementacji i kończę na plikach .h i .cpp
źródło
Na szczęście jest to proste.
Powinieneś użyć rozszerzenia .hpp, jeśli pracujesz z C ++ i powinieneś użyć .h do C lub mieszania C i C ++.
źródło
Używam .h, ponieważ tego właśnie używa Microsoft i tego, co tworzy ich generator kodów. Nie musisz iść pod prąd.
źródło
W „The C ++ Programming Language, Third Edition Bjarne Stroustrup”, najważniejszej książce C ++, którą należy przeczytać, używa * .h. Zakładam więc, że najlepszą praktyką jest użycie * .h.
Jednak * .hpp też jest w porządku!
źródło
.hpp
nim sam język.Narzędziom i ludziom łatwo jest coś odróżnić . Otóż to.
W konwencjonalnym użyciu (przez boost, itp.), W
.hpp
szczególności są nagłówki C ++. Z drugiej strony.h
dotyczy nagłówków innych niż C ++ (głównie C). Precyzyjne wykrywanie języka treści jest na ogół trudne, ponieważ istnieje wiele nietrywialnych przypadków, więc różnica ta często sprawia, że gotowe do użycia narzędzie jest łatwe do napisania. Po przyjęciu konwencji dla ludzi jest również łatwy do zapamiętania i łatwy w użyciu.Zaznaczam jednak, że sama konwencja nie zawsze działa zgodnie z oczekiwaniami.
.hpp
sam nie jest jedynym wyborem. Dlaczego nie.hh
czy.hxx
? (W każdym razie zazwyczaj potrzebujesz co najmniej jednej konwencjonalnej reguły dotyczącej nazw plików i ścieżek).Osobiście korzystam zarówno z moich projektów C ++, jak
.h
i.hpp
z nich. Nie przestrzegam powyższej konwencji, ponieważ:.h
. Wykrywanie języka plików na github.com. (W komentarzach może być coś takiego jak shebang, aby te pliki źródłowe były lepszymi metadanymi, ale nawet nie są one konwencjonalne jak nazwy plików, więc ogólnie nie są wiarygodne).Zwykle używam
.hpp
nagłówków C ++ i nagłówki powinny być używane (utrzymywane) tylko w nagłówkach , np. Jako biblioteki szablonów. W przypadku innych nagłówków w pliku.h
istnieje albo odpowiedni.cpp
plik jako implementacja, albo nagłówek inny niż C ++. To ostatnie jest trywialne do odróżnienia zawartości nagłówka przez ludzi (lub przez narzędzia z jawnie osadzonymi metadanymi, jeśli to konieczne).źródło
Rozszerzenie pliku źródłowego może mieć znaczenie dla twojego systemu kompilacji, na przykład możesz mieć regułę w swoim makefile dla plików
.cpp
lub.c
plików, lub twój kompilator (np. Microsoftcl.exe
) może skompilować plik jako C lub C ++ w zależności od rozszerzenia.Ponieważ musisz podać całą nazwę pliku do
#include
dyrektywy, rozszerzenie pliku nagłówka nie ma znaczenia. Jeśli chcesz, możesz dołączyć.c
plik do innego pliku źródłowego, ponieważ jest to tylko tekst. Twój kompilator może mieć opcję zrzucenia wstępnie przetworzonych danych wyjściowych, co to wyjaśni (Microsoft:/P
wstępne przetwarzanie do pliku,/E
wstępne przetwarzaniestdout
,/EP
pomijanie#line
dyrektyw,/C
zachowanie komentarzy)Możesz użyć
.hpp
pliku, który dotyczy tylko środowiska C ++, tzn. Używają funkcji, które nie będą się kompilować w C.źródło
Żadne konkretne rozszerzenie nie ma żadnej korzyści, poza tym, że może mieć inne znaczenie dla Ciebie, kompilatora i / lub twoich narzędzi.
header.h
jest prawidłowym nagłówkiem.header.hpp
jest prawidłowym nagłówkiem.header.hh
jest prawidłowym nagłówkiem.header.hx
jest prawidłowym nagłówkiem.h.header
jest prawidłowym nagłówkiem.this.is.not.a.valid.header
jest prawidłowym nagłówkiem odmowy.ihjkflajfajfklaf
jest prawidłowym nagłówkiem. Tak długo, jak nazwa może zostać poprawnie przeanalizowana przez kompilator, a system plików ją obsługuje, jest to prawidłowy nagłówek, a jedyną zaletą rozszerzenia jest to, co się w nim odczytuje.To powiedziawszy, możliwość dokładnego przyjmowania założeń na podstawie rozszerzenia jest bardzo przydatna, dlatego rozsądnie byłoby zastosować łatwo zrozumiały zestaw reguł dla plików nagłówkowych. Osobiście wolę zrobić coś takiego:
.h
. Nie ma dwuznaczności..h
, natomiast nagłówek kompatybilny z C ++, ale nie dostaje C.hpp
lub.hh
czy coś w tym rodzaju.Jest to oczywiście jeden z wielu sposobów obsługi rozszerzeń i niekoniecznie możesz zaufać swojemu pierwszemu wrażeniu, nawet jeśli wszystko wydaje się proste. Na przykład, widziałem wzmiankę o używaniu
.h
dla normalnych nagłówków i.tpp
dla nagłówków, które zawierają tylko definicje funkcji składowych klasy w szablonie, z.h
plikami, które definiują klasy szablonowe, w tym.tpp
pliki, które definiują ich funkcje składowe (zamiast.h
nagłówka zawierającego bezpośrednio oba deklaracja funkcji i definicja). Na przykład, wiele osób zawsze odzwierciedla język nagłówka w jego rozszerzeniu, nawet jeśli nie ma szans na dwuznaczność; dla nich.h
zawsze jest nagłówek C i.hpp
(lub.hh
, lub.hxx
itp.) jest zawsze nagłówkiem C ++. I znowu, niektórzy ludzie używają.h
„nagłówka skojarzonego z plikiem źródłowym” i.hpp
„nagłówka ze wszystkimi funkcjami zdefiniowanymi inline”.Biorąc to pod uwagę, główną zaletą byłoby konsekwentne nazywanie nagłówków tym samym stylem i uczynienie tego stylu widocznym dla każdego, kto bada twój kod. W ten sposób każdy, kto zna Twój zwykły styl kodowania, będzie w stanie określić, co masz na myśli z danym rozszerzeniem, tylko pobieżnym spojrzeniem.
źródło