Kości wracają do C++

1

Moje stare kości postanowiły po latach wrócić do C++. Słyszałem o C++11 ale potem kontakt z językiem mi się urwał.

Cel:

  • Side project, a więc nie muszę nic w legacy. Ma być wszystko porządnie i po nowemu.

Czego szukam:

  • Książka opisująca najnowszy standard C++ i best practices (może być więcej niż jedna)
  • Jaki system buildu wybrać?
  • Jakie IDE jest teraz na topie (macOS/Linux)? Nie mówcie że stary Eclipse...
  • Czy C++ doczekał sie w końcu managera paczek? Jeśli tak to jakiego warto użyć?
  • Wszystko inne co przychodzi wam do głowy.
3
0xmarcin napisał(a):
  • Książka opisująca najnowszy standard C++ i best practices (może być więcej niż jedna)

Że czysty C++ MZ nie istnieje, a realny program posiadający interfejs użytkownika to zawsze ciągnie jakiś DIALEKT C++

4

@0xmarcin:

3

Książka opisująca najnowszy standard C++ i best practices (może być więcej niż jedna)

Nie ma i to jest największy ból tego języka imo. Nie wiadomo jak pisać a potem co projekt/rekrutacja to każdy ma inną wizję tego jakie są dobre praktyki i jak powinien kod wyglądać.
Teoretycznie jest https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines ale tam są same podstawy i do np interfejsów każą używać zewnętrznej biblioteki co jest mało śmiesznym żartem, bo to oficjalne stanowisko komisji standaryzacyjne xD.

Z książek dwa lata temu powstała:
C++ Software Design - Klaus Iglberger
Przeczytałem kawałek i wydaje się być przełamaniem tej nicości. Poza tym masz mnóstwo ksiazek o funkcjonalnościach języka, czyli jak działa "move" na 100 stronach. Musisz oglądać mnóstwo cppconów i z tego wyciągać ułamki wiedzy.

Jaki system buildu wybrać?

Najlepszy do domowych projektów jest msvc z visual studio. Możesz wszystko wyklikać w sekundy w ustawieniach i nie przepychasz się z CMake, ale to tylko na windowsa.

Poza tym to niestety CMake zostaje.

Jakie IDE jest teraz na topie (macOS/Linux)? Nie mówcie że stary Eclipse...

Visual studio, CLion i Visual Studio Code. Do wyboru do koloru.

Visual Studio imo najlepszy, ale płatny.
CLion jest od jetbrainsów więc ma też swoich fanów.

Czy C++ doczekał sie w końcu managera paczek? Jeśli tak to jakiego warto użyć?

No jest conan, ale nie ułatwia on życia jakoś w domowych projektach. Poza tym to chyba kpisz xD.

Wszystko inne co przychodzi wam do głowy

Pytanie, co dokładnie chcesz zrobić?

2

Nie ma i to jest największy ból tego języka imo. Nie wiadomo jak pisać a potem co projekt/rekrutacja to każdy ma inną wizję tego jakie są dobre praktyki i jak powinien kod wyglądać.

Takiej książki/dokumnetacji nie ma i chyba istnieć nie może. Tzw. "dobre praktyki" na ogół są takie same niezależnie od języka programowania. Mogę napisać taki sam program w C++, potem w C#, potem w Java. Oczywiście będą pewne różnice w implementacji, ale ogólne zasady tworzenia programowania obiektowego będą takie same. A takie rzeczy, że np. w wersji C++14 dodano wskaźniki unique_ptr,shared_ptr,weak_ptr mające zastąpić new/delete, to jest bardziej naturalna kolej rzeczy. Wskaźniki znacznie zmniejszają możliwość niechcianej manipulacji na pamięci.

Język programowania i kompilator to jest tylko narzędzie i nie ma "jedynego słusznego" sposobu użytkowania. Każdy używa tak, jak lubi. Np. są różne style nazywania zmiennych (jakasNazwa, JakasNazwa, jakas_nazwa itp.) i wcięć, np znak { w nowej linii lub na końcu poprzedzającej, jest kilka sposobów i żaden nie jest lepszy, ani gorszy, tylko inny.

Jakie IDE jest teraz na topie (macOS/Linux)? Nie mówcie że stary Eclipse...

Nie wiem, czy "na topie", ale ja używam Qt Creator, może nie najlepszy, ale darmowy, prosty i łatwy do ustawienia IDE, bez konfiguracji z CMake/QMake. A jeżeli szukasz tak naprawdę notatnika z kolorowaniem składni, to Visual Studio Code, który jest darmowy (nie mylić z Visual Studio, bez słowa "code").

Że czysty C++ MZ nie istnieje, a realny program posiadający interfejs użytkownika to zawsze ciągnie jakiś DIALEKT C++

Bardziej biblioteki zewnętrzne. W czystym C++ tworzy się logikę biznesową i aplikacje konsolowe mające tylko strumień wejścia i wyjścia. A jak ma korzystać z okienek (Qt, GTL) lub z JavaScript w WASM, to zawsze jest podłączona biblioteka.

Jak już o WASM mowa, a OP "zatrzymał się" na C++11, to pragnę wspomnieć, że w międzyczasie C++ zyskało jeszcze jedno, całkowicie nowe zastosowanie, czyli WebAssembly:
https://emscripten.org/index.html
https://labs.leaningtech.com/cheerp
Tu trzeba umieć też HTML i JavaScript (wystarczy podstawy), ale raz kompilując program, można uruchomić "na wszystkim", co ma nowoczesną przeglądarkę internetową. Do tego nie ma pełnego IDE, jest tylko kompilator uruchamiany z linii poleceń, ale w połączeniu z jakimś notatnikiem kolorującym składnie lub jakimś IDE użytym w roli pisania i sprawdzania poprawności kodu, da radę.

6

Słyszałem o C++11 ale potem kontakt z językiem mi się urwał.

Słyszałeś i umiesz czy tylko słyszałeś? Jeżeli tylko słyszałeś to zacznę tak. W samym języku od C++11 za wiele się nie zmieniło, no może z wyjątkiem metaprogramowania. Późniejsze standardy to zazwyczaj ficzery do biblioteki. Dlatego bardzo ważne jest żebyś dobrze zrozumiał C++11 i "move semantics". Tutaj zacząłbym od książki Stroustrupa "Tour Of C++" dotyczącej C++11 plus wspomóc się artykułami po sieci, np. Andrzej's Blog jest spoko no i C++ Weekly na youtube Jasona Turnera. Bardzo ważny jest copy-and-swap idiom w konsktrukcji klas, podkreślam bo książki pewnie nie wspomną a oszczędzi Ci to frustracji.

Jak już ogarniesz co się wydarzyło w C++11 to tak na prawdę umiesz już C++14 bo dodali do niego same drobiazgi i nawet nie jestem sobie w stanie przypomnieć co zawierał oprócz dodania std::make_unique. Potem każdy standard to zazwyczaj jeden, może dwa duże ficzery i jakieś drobiazgi, sporo metaprogramowania także jak Cię to nie interesuje to po C++11 każdy standard to już wchodzi na miękko. Czyli zapoznajesz się z tym dużym ficzerem i potem sobie uzupełniasz w trakcie taką lista jak 20 smaller yet handy C++20 feattures.

Nie schodziłbym poniżej C++17 - gwarantowane copy ellision, std::optional, std::variant, std::string_view, if constexpr, fold expressions, polifomorficzne alokatory i structured bindings (mój ulubiony mały ficzer). Dużo małych dobroci weszło. C++ 23 jeszcze ciężko mi ocenić stabilność także pozostaje wybór C++17 albo C++20. W tym drugim weszły zakresy, które nie każdemu pasują, moduły i korutyny, które nie znalazły jeszcze szerszego zastosowania, spaceship operator, który nie każdemu pasuje. Zostaje w sumie std::format i constexpr na std::string czy std::vector.

IDE "wszystko w jednym" na linuksa warte funta kłaków to w sumie CLiona i QtCreator i szczerze pisząc, ja bym się skłaniał bardziej ku QtCreator bo dużo rzeczy mogę sobie w nim wyklikać a w CLion trzeba przepychać się z CMake którego nie znoszą. QtCreator to niezależne IDE, nie jesteś zmuszony używać Qt w swoim projekcie żeby użyć QtCreator. Wciąż całkiem popularne jest podejście edytor + debugger, w takim układzie edytor zostawiam wg. preferencji a debugger poleciłbym kdbg.

Budowanie to wciąż nierozwiązany problem i cokolwiem co pozwoli Ci uporać się z tym szybciej będzie lepsze. Sam często używam jeszcze make'a (linuks) ale nie dlatego, że jest dobry tylko kiedyś postanowiłem się go nauczyć i skoro już go znam to często jestem sobie w stanie czyściej nim projekt ogarnać niż szarpać się z cmake, który w sumie nawet nie jest pełnoprawnym systemem budowania. Czymkolwiek postanowisz budować pamiętaj, że musi Ci on zapewnić zrównolegalnie i wsparcie przynajmniej jednego z dwóch - prekompilowane nagłówki lub unity builds - a najlepiej jakby wspierało oba. Prekompilowane nagłówki to minimun, używaj ich od samego początku a oszczędzisz sobie sporo czasu. Wsparcie dla nich oferuje sam kompilator także jeśli system budowania obfuskuje jego użycie to jest to zły system budowania.

Menedżer paczek na wiele platform to conan jest szeroko używany, ale samnie używałem. Na windowsie jest vcpkg i nawet mi pasuje, bo ściąga źródła biblioteki i buduje Ci binarki Twoim lokalnym toolsetem, także odpadają jakieś zagwozdki typu binarna kompatybilność i takie tam. No i masz źródła od razu z których budowałeś, także debuggowanie czy jakiś lokalny patch jest prosty do zrobienia. Dobrze się integruje z VisualStudio. Ale vcpkg to tylko windows niestety.

4
0xmarcin napisał(a):

Moje stare kości postanowiły po latach wrócić do C++. Słyszałem o C++11 ale potem kontakt z językiem mi się urwał.

wyszło już

  • C++14
  • C++17
  • C++20 (troszkę brakuje do pełnego wsparcia przez kompilatory)
  • C++23 (ten ostatni nadal jest słabo wspierany przez kompilatory).
  • w planach jest C++26

Czego szukam:

  • Książka opisująca najnowszy standard C++ i best practices (może być więcej niż jedna)

https://stackoverflow.com/a/388282/1387438

  • Jaki system buildu wybrać?

Jak planujesz wiele platform to CMake (generator systemów budowania) jest w zasadzie standardem C++

  • Jakie IDE jest teraz na topie (macOS/Linux)? Nie mówcie że stary Eclipse...

Płatne CLion, Darmowe VS code (IDE do wszystkiego nie tylko C++, więc może znasz).
Qt Creator też jest fajny.

  • Czy C++ doczekał sie w końcu managera paczek? Jeśli tak to jakiego warto użyć?
  • conan
  • cpm
  • vcpkg
  • Wszystko inne co przychodzi wam do głowy.

https://stackoverflow.com/a/367662/1387438
https://github.com/fffaraz/awesome-cpp
https://stackoverflow.com/questions/81656/where-do-i-find-the-current-c-or-c-standard-documents/83763#83763

4
Side project, a więc nie muszę nic w legacy. Ma być wszystko porządnie i po nowemu.

Moje stare kości postanowiły po latach wrócić do C++. Słyszałem o C++11 ale potem kontakt z językiem mi się urwał.

To już lepiej iść do rust.

0
  • książki nie polecę
  • do budowania to tylko cmake
  • vscode, qtcreator, CLion
  • do ogarniania paczek ja uzywam cmake + FetchContent
0
Czitels napisał(a):

Visual Studio imo najlepszy, ale płatny.

Obawiam się nie zrobiłeś riserczu

Community jest bardzo dobrze wyposazoną wersją, nie kosztuje ani grosza (rejestracja)
Trudno powiedzieć, czy płatne dodają cokolwiek z ficzerów, które będą przydatne samotnemu jeżdzcowi na tym (i wiele dalszym) etapie

0
0xmarcin napisał(a):
  • Jakie IDE jest teraz na topie (macOS/Linux)? Nie mówcie że stary Eclipse...

Jak dla mnie neovim jest dobry do wszystkiego.

  • Czy C++ doczekał sie w końcu managera paczek? Jeśli tak to jakiego warto użyć?

Conan jest napisany w pythonie, to wtedy dochodzi ci zależność pythona, żeby projekt zbudować.
Ogólnie strasznie kiepsko jest to jakoś stworzone, ręcznie w bash czy pythonie lepiej rozwiązywanie zależności można rozwiązać.

Czyli lista zależności będzie ładnie rosła.
Od kompilatora, make, cmake, python, git.
Potem cmake może resztę zależności zaciągnąć z githuba czy używając vcpkg.

Stare projekty zwykle w ogóle nie rozwiązują zależności po prostu ciągle wywala błędy na ekran i po kolej dodajesz aż wszystkie zależności rozwiążesz.

CMake może wygenerować Makefile(na linuxie) jeśli backend jest ustawiony na taki i wtedy prościej analizować jakieś problemy budowania.
Może też być inny użyty to wtedy inna zależność dochodzi.

Jak dla mnie najwygodniej to po prostu jakimś skryptem powłoki czy jakimś skryptowym, pobrać wszystkie zależności, wypakować, podlikować directories przy budowaniu projektu.
Jak każda libka ma swojego githuba to ten FetchContent idealnie pasuje z CMake i jak już to bym brał tego vcpkg, bo canon to jakiś dziwny jest i tylko burdel w projekcie jest.

0
AnyKtokolwiek napisał(a):
Czitels napisał(a):

Visual Studio imo najlepszy, ale płatny.

Obawiam się nie zrobiłeś riserczu

Community jest bardzo dobrze wyposazoną wersją, nie kosztuje ani grosza (rejestracja)
Trudno powiedzieć, czy płatne dodają cokolwiek z ficzerów, które będą przydatne samotnemu jeżdzcowi na tym (i wiele dalszym) etapie

Korzystałem z tego sporo zawodowo w pierwszej firmie i prywatnie, ale fakt mogę nie być już na czasie. Do domowych projektów, żeby naklepać cokolwiek to prawda, lecz wersja professional rozszerzała Ci profiller (rzędy lepszy niż ten nieszczęsny valgrind) co było przyjemne, ale ten darmowy też jest spoko.

0

dygresja ale dlaczego cpp a nie np rust
nie namawiam do zmiany wyboru naprawdę jestem ciekaw powodów

0

Trudno powiedzieć, czy płatne dodają cokolwiek z ficzerów, które będą przydatne samotnemu jeżdzcowi na tym (i wiele dalszym) etapie

Jeśli chodzi o C++ to różnice techniczne i ergonomiczne są bardzo minimalne. Wersja community kiedyś była pozbawiona wbudowanych narzędzi do tworzenia GUI, w sensie WYSIWIG kreatora do lepienia MFC i tym podobnych. Nie jestem do końca pewny czy nadal się tego trzymają, ale jeśli nawet to nie jest to specjalny bloker bo świeży projekt w C++ nie będzie lepił gui z microsoftowych frameworków. Do winapi i tak nie ma kreatorów. Różnie też bywało z profilerami czy "diagnostic tools" ale to się głównie dotyczyło .net bo w C++ to albo nie działają albo są do niczego także i tak używa się czegoś zewnętrznego.

Jest też różnica licencyjna. Community możesz używać swobodnie dla open source, oraz jako indywidualny programista. Możesz stworzyć produkt i go sprzedać. Problem jest chyba tylko, jeśli chciałbyś robić zlecenia dla firm, które używają płatnych licencji. Choć małe firmy do kilku deweloperów (nie pamiętam ilu) również mogą/mogły używać community.

ps. Nic co napisałem powyżej nie jest poradą prawną.

0
YetAnohterone napisał(a):

dygresja ale dlaczego cpp a nie np rust
nie namawiam do zmiany wyboru naprawdę jestem ciekaw powodów

Bardzo prozaiczna sprawa. Rozpowrzechnienie. Libki, narzędzia itd.Szczególnie że część dużego embbeded ma po prostu własne libki do zadań X. Przepisywać czy warpować tego się nikomu nie będzie chciało najczęściej bo sensu finasowego może nie mieć(https://docs.rust-embedded.org/book/interoperability/c-with-rust.html). To tak po prostu dlaczego nie zawsze się to opłaca czy będzie możliwe(np. taki stm32 ma tylko jakieś wsparcie społęcznościowe dla rust).
I rust to nie remedium na wszystko. Mozesz przepisać kulaowy soft w C++ na kulawy soft w Rust. Chociaż rust trochę cię po prostu ograniczy i możliwe że bedzie mniej błędów.

2
MarekR22 napisał(a):
0xmarcin napisał(a):
  • Czy C++ doczekał sie w końcu managera paczek? Jeśli tak to jakiego warto użyć?
  • conan
  • cpm
  • vcpkg

Śmieszna spraw w obecnym projekcie nad, którym pracuję właśnie wporadzamy package manger i trzeba było coś wybrać.
Jeden z komentarzy mnie rozbawił:

[Yesterday 2:48 PM] Coworker
Well the realistically the choice were just 2, conan and vcpkg
[Yesterday 2:49 PM] Coworker
And guy at conan fucked up the 2.0 release royally so made it easier to decide

2

Dziękuje za odpowiedzi, wygląda na to że VSCode będzie najlepszym wyborem na macOS.
CMake jako system buildu oraz vcpkg jako manager pakietów.

Z książek zamówiłem C++ Prime Lipmanna.

2
0xmarcin napisał(a):

Dziękuje za odpowiedzi, wygląda na to że VSCode będzie najlepszym wyborem na macOS.
CMake jako system buildu oraz vcpkg jako manager pakietów.

Z książek zamówiłem C++ Prime Lipmanna.

Na MacOS używam tylko Xcode. Bardzo lubię, bo działa turbo szybko (Cmd+Shift+O do nawigacji po kodzie, działa w mgnieniu oka), ma fajny tooling, a jak rozkmini się nieco inny UI to okazuje się super (przykładowo breakpointa kasuje się przez przesuwanie go w poziomie). Dla mnie jedyną wadą jest bug debuggera, gdzie kłamie czasem o wartości bool/BOOL (Obj C).

0
MarekR22 napisał(a):

Na MacOS używam tylko Xcode. Bardzo lubię, bo działa turbo szybko (Cmd+Shift+O do nawigacji po kodzie, działa w mgnieniu oka), ma fajny tooling, a jak rozkmini się nieco inny UI to okazuje się super (przykładowo breakpointa kasuje się przez przesuwanie go w poziomie). Dla mnie jedyną wadą jest bug debuggera, gdzie kłamie czasem o wartości bool/BOOL (Obj C).

Ja za to uwielbiam neovim.

Ogólnie to neovim jest po prostu piękny, jak dodać cmake, wystarczy dodać jeden klawisz mappingu, który odpali cmake domyślnie z pathem do vcpkg, jakaś jedna linjka kodu i do budowy druga linijka, dwa skróty klawiszowe.
Skrót np. od cmake build, cb.

vim.keymaps.set("n", "<space>cb", function()
  vim.cmd("!cmake --build ./build")
end, { desc = "CMake build project" })

Teraz w edytorze wciskam spacja c b i zostanie wywołana komenda shella.

Teraz żeby language server protocol mógł operować na paczkach z vscpkg wystarczy dodać relatywny path względem aktualnego katalogu projektu do lsp zależnie jakiego mamy do c++, np. clangd, to do skryptu lsp, który wywołuje attach do clangd dodajemy, żeby cmd command uwzględnił relatywny path do vcpkg przy uruchomieniu.
Czyli ./build/vcpkg_installed/x64_linux/include i teraz neovim może bez problemowo wyszukać wszystkie zainstalowane paczki przez vcpkg.

Jak dla mnie to jest najprostszy i najlepszy edytor, jak potrzeba zrobić jakiś dodatkowy config to można np. jsona i z lua odczytać np. po skrócie klawiszowym.

Easy do konfiguracji, bo mogę to zrobić bez szukania informacji w internecie na podstawie po prostu ogólnej wiedzy jak się buduje program w danym języku.
Wszystko też działa ekstremalnie szybko.

W Xcode czy vscode rozszerzanie IDE jest znacznie bardziej czasochłonne, a tu dopisujesz linijkę, git commit, git push i gotowe :>

1

ChatGPT:

Oceń prawdopodobieństwo, że powyższa wypowiedź została wygenerowana przez ChatGPT, jest bardzo wysokie, ponieważ zawiera typowe porady i informacje związane z programowaniem w języku C++. Wypowiedź jest logicznie zorganizowana i zawiera sugestie dotyczące nauki, narzędzi programistycznych oraz wskazówek dotyczących wyboru IDE i systemu buildu, co jest charakterystyczne dla ChatGPT. Dodatkowo, styl i ton są zgodne z tym, co można oczekiwać od sztucznej inteligencji.

1

oraz vcpkg jako manager pakietów

@0xmarcin W takim razie z dwóch dostępnych trybów pracy polecam tryb manifestu a pod spodem masz zestaw opcji, których sam używam w swoim projekcie, żeby vcpkg umieszczał swoje pliki tam gdzie chcesz i nie pisał Ci po systemie.

--downloads-root="" --x-install-root="" --x-packages-root="" --x-buildtrees-root="" --binarysource=""

1 użytkowników online, w tym zalogowanych: 0, gości: 1