x.....x
x.....x
#programowanie #cpp

https://github.com/CRYTEK-CRYENGINE/CRYENGINE/tree/release/Code/CryEngine/CryCommon/CryMath

Mirki, goście tutaj widzę pakują implementacje funkcji do plików .h, miejscami tylko robią costam.h i costamImpl.h. Jak parę lat temu uczyłem się c++ to zawsze dzieliło się na pliki h i cpp. To co oni stosują tutaj to jakaś znana w świecie c++ konwencja?
  • Najlepsze
  • Wszystkie komentarze
A.....a
A.....a
@xmichaelx: nie wiem co Ci koledzy piszą wcześniej, ale z żadną z tych odpowiedzi nie zgodziłbym się w pełni..

1. Po co dzielimy na .h (/ .hpp) i .cpp?
Po to, że *include-ując* za każdym razem cały kod (nagłówki + implementacja), czas kompilacji byłby bardzo długi i jeśli zmienił byś coś w implementacji a nie nagłówku/API klasy/struktury/funkcji, to ta klasa jak i zależne od niej musiały by zostać przebudowane od nowa. Gdy
A.....a
A.....a
Treść przeznaczona dla osób powyżej 18 roku życia...
rotflolmaomgeez
@xmichaelx: Nie. Pliki nagłówkowe (.h) służą jedynie do przechowywania nagłówków funkcji/struktur/definiowanych stałych. Nie powinny zawierać żadnej implementacji. Mogą ją zawierać, ale jest to niezgodne z ideą języka.

Według tej odpowiedzi na Stack Overflow czasami można, ale trzeba wiedzieć co się robi.
GwnBrz
@AferaZaAfera: @xmichaelx: Świetna odpowiedź ale brakuje jeszcze jednej rzeczy.
Pamiętajcie, że CryEngine dopiero od niedawna jest open-source. Czasami plik nagłówkowy zdradza zbyt dużo na temat implementacji klasy, szczegóły, które chcemy ukryć. Wtedy stosuje się tzw. PIMPL idiom, czyli ukrywanie implementacji w oddzielnej strukturze. Możliwe, że to nie zostało jeszcze zmienione albo nawet nikt nie ma zamiaru tego zmieniać, pomimo tego, że projekt jest już open-source i nie ma
sasik520
@AferaZaAfera: takie tłumaczenie to zwykłe lanie wody.

Czas kompilacji? Przebudowywanie od nowa? C#, java i multum innych języków jakoś sobie świetnie radzi bez tego poronionego pomyslu. Są tez precompiled headers, które może nie są remedium na wszelkie zło, ale złe też nie są.

Nawet w przypadku template'ów są extern template'y i dopóki nie piszesz biblioteki, sa fajne.
Optymalizacje - j.w. W przypadku biblioteki zgoda, w przypadku własnego kodu - lepiej zdać się
a.....7
a.....7
@xmichaelx: Jeśli to nie jest złożony kod, to chyba nic nie stoi na przeszkodzie aby ciała funkcji i klas dać do plików nagłówkowych.
szpieg_z_krainy_deszczowcow
@xmichaelx: Zastanów się w jaki sposób będziesz korzystał z funkcji matematycznych. Tak to popularna praktyka.
GlenPL
@AferaZaAfera: powinieneś dostać awans za te odpowiedzi mirku, duży plus! :)
rfree
@rotflolmaomgeez: bzdura, mogą zawierać.

A w wypadku templatów to jest to właściwie niezbędne
x.....x
x.....x
@AferaZaAfera: Nie jestem aktywnym programistą C++, ciekaw byłem czy konwencja wykorzystywana w silniku CryTek to coś popularnego czy stosunkowo niszowe podejście. Dzięki za solidne wyjaśnienie :)
Nadrill
@xmichaelx: wybieranie sobie komercyjnego produktu jako guidelinesow to nie najlepszy pomysl ( ͡° ͜ʖ ͡°)
piotrb
C#, java i multum innych języków jakoś sobie świetnie radzi bez tego poronionego pomyslu.


@sasik520: I dlatego do C# wprowadzono partial classes?
sasik520
@piotrb: co mają partial classes do h/cpp? Wydaje mi się, że (jedyne?) sensowne zastosowanie dla partial classes to ukrywanie/oddzielenie kodu wygenerowanego automatycznie od napisanego ręcznie.

@AferaZaAfera: srutututu srutututu. W takim stanie, jak teraz, to pewnie, z c++ h/cpp się nie usunie. Ale język powinien do tego dążyć, moim zdaniem. I dlaczego niby porównanie do c# czy innego języka jest złe? C++ od samego początku czerpie całymi garściami z
piotrb
Wydaje mi się, że (jedyne?) sensowne zastosowanie dla partial classes to ukrywanie/oddzielenie kodu wygenerowanego automatycznie od napisanego ręcznie.


@sasik520: Masz rację, wydaje Ci się.
sasik520
@piotrb: a jakiś konkretny przykład? Sporo piszę w c# na co dzień, partial class nie używam, a może warto, żebym zaczął.
piotrb
@sasik520: Konkretny przykład dotyczy właśnie czasu kompilacji, ta część która się nie zmieniła, nie musi być kompilowana ponownie, a o tym była dyskusja. Jeżeli międzymordzie klasy się nie zmieni, to nie ma potrzeby rekompilacji niczego poza faktycznie zmienionym fragmentem. IMHO motywacje wprowadzenia były 2: pierwsza to faktycznie oddzielenie kodu generowanego, a druga to usprawnienie procesu kompilacji.
rozrewolwerowanyrewolwer
taktyk