0.12 — Konfigurowanie kompilator: Wybór standardu językowego

Z wieloma dostępnymi wersjami C++ (C++98, C++03, C++11, C++14, C++17, C++20, C++23 itd.) skąd kompilator wie, którego użyć? Ogólnie rzecz biorąc, kompilator wybierze standard, który będzie domyślny. Zazwyczaj wartością domyślną jest nie najnowszy standard językowy — wiele z nich domyślnie korzysta z C++14, w którym brakuje wielu najnowszych i najlepszych funkcji.

Jeśli chcesz używać innego standardu językowego (a prawdopodobnie tak się stanie), będziesz musiał skonfigurować do tego swoje IDE/kompilator.

Konwencjonalne nazwy standardów językowych (np. C++20) opierają się na roku, w którym standard językowy został opublikowany (lub roku, w którym standard językowy został opublikowany) zostać opublikowany). Ponieważ rok publikacji nie jest tak naprawdę znany, dopóki nie jest bliski, standardy językowe znajdujące się na wczesnym etapie rozwoju czasami używają zamiast tego nazwy rozwoju. Na przykład C++20 jest również znany jako C++2a.

Rok publikacjiNazwa formalnaNazwa konwencjonalnaNazwa opracowaniaUwagi
2011ISO/IEC 14882:2011C++11C++0x
2014ISO/IEC 14882:2014C++14C++1y
2017ISO/IEC 14882:2017C++17C++1z
2020ISO/IEC 14882:2020C++20C++2a
2024ISO/IEC 14882:2024C++23C++2bSfinalizowano (technicznie ukończono) w 2023
Do ustaleniaDo ustaleniaC++26C++2c

Na marginesie…

C++11 ma nazwę rozwojową C++0x ponieważ pierwotnie oczekiwano, że zostanie opublikowany przed 2010 rokiem.

Jaki standard językowy wybrać wybrać?

W środowiskach profesjonalnych często wybiera się standard językowy będący jedną lub dwiema wersjami starszymi od najnowszego, sfinalizowanego standardu (np. jeśli C++20 jest najnowszą sfinalizowaną wersją, oznacza to C++14 lub C++17). Zwykle robi się to, aby mieć pewność, że twórcy kompilatorów mieli szansę naprawić defekty i aby dobrze zrozumieć najlepsze praktyki dotyczące nowych funkcji. W stosownych przypadkach pomaga to również zapewnić lepszą kompatybilność między platformami, ponieważ kompilatory na niektórych platformach mogą nie zapewniać od razu pełnej obsługi nowszych standardów językowych.

W przypadku projektów osobistych i podczas nauki zalecamy wybranie najnowszego, sfinalizowanego standardu, ponieważ nie ma to żadnych wad.

Wskazówka

Wiele kompilatorów oferuje obsługę „eksperymentalną” lub „podglądową” dla funkcji z nadchodzących, niesfinalizowanych standardów językowych. Twoje IDE może oferować tę opcję jako opcję w ustawieniach, w których konfigurujesz standard językowy, lub możesz włączyć ją ręcznie, używając konwencjonalnej nazwy lub nazwy rozwojowej nadchodzącego standardu językowego.

Obsługa funkcji z niesfinalizowanych standardów językowych będzie niekompletna i prawdopodobnie zawiera błędy.

Nota autora

Ta witryna jest obecnie przeznaczona dla standardu C++17, co oznacza, że ​​w naszych lekcjach i przykładach zakładamy, że Twój kompilator obsługuje C++17. Niektóre treści C++20 i C++23 są dostępne dla tych, które posiadają kompatybilne kompilatory.

Aby w pełni wykorzystać całą treść lekcji, zalecamy użycie najnowszego standardu językowego obsługiwanego przez Twój kompilator.

Jeśli Twój kompilator nie obsługuje C++17, zalecamy aktualizację do takiego, który obsługuje lub rozważ użycie kompilatora online obsługującego C++17 lub nowszy podczas nauki.

Przypomnienie

W przypadku zmiany standardu językowego (lub dowolnego inne ustawienia projektu), dokonaj zmian we wszystkich konfiguracjach kompilacji.

Ustawianie standardu językowego w Visual Studio

W chwili pisania tego tekstu Visual Studio 2022 domyślnie korzysta z możliwości C++14, co nie pozwala na korzystanie z nowszych funkcji wprowadzonych w C++17 i C++20.

Aby korzystać z tych nowszych funkcji, musisz włączyć nowszy standard językowy. Niestety, obecnie nie można tego zrobić globalnie — należy to robić indywidualnie dla każdego projektu.

Ostrzeżenie

W programie Visual Studio za każdym razem, gdy tworzysz nowy projekt, konieczne będzie ponowne wybranie standardu językowego.

Aby wybrać standard językowy, otwórz projekt, a następnie przejdź do menu projektu > (nazwa aplikacji) Właściwości, a następnie otwórz Właściwości konfiguracji > C/C++ > Język.

Najpierw upewnij się, że Konfiguracja jest ustawiona na „Wszystkie konfiguracje”.

Stamtąd możesz ustawić Standard języka C++ na wersję C++, którą chcesz użyj.

Wskazówka

Zalecamy wybranie najnowszego standardu „ISO C++ Latest (/std:c++latest)”, który zapewni możliwość użycia tylu funkcji, ile obsługuje Twój kompilator.

Upewnij się, że wybierasz standard języka z menu rozwijanego (nie wpisuj go).

Powiązana treść

Aby uzyskać więcej informacji na temat ustawień standardu języka Visual Studio, firma Microsoft udostępnia język Visual Studio standardowy dokument referencyjny.

Ustawianie standardu językowego w Code::Blocks

Code::Blocks może domyślnie używać standardu językowego starszego niż C++ 11. Na pewno będziesz chciał sprawdzić i upewnić się, że jest włączony nowszy standard językowy.

Dobrą wiadomością jest to, że Code::Blocks pozwala ustawić standard językowy globalnie, więc możesz ustawić go raz (a nie dla każdego projektu). Aby to zrobić, przejdź do Ustawienia > Kompilator…:

Code::Blocks Settings > Kompilator

Następnie znajdź pola wyboru oznaczone Czy g++ przestrzega standardu języka C++XX ISO C++ [-std=c++XX], gdzie XX to pewna liczba (np. 20, 17, itp…) reprezentujący standard językowy:

Code::Blocks Ustawienie C++11

Jeśli na tej liście pojawia się C++23, C++20 lub C++17, wybierz ten, który reprezentuje najnowszy standard ISO (np. wybierz Czy g++ przestrzega standardu języka ISO C++20 Jeśli widzisz na tej liście również standardy GNU, zignoruj je.

Jeśli nie widzisz C++17). na tej liście zaktualizuj do najnowszej wersji Code::Blocks.

Ostrzeżenie

W chwili pisania tego tekstu aktualna wersja Code::Blocks (20.03) korzysta z przestarzałego kompilatora (GCC 8.1.0).

Zalecamy aktualizację kompilatora poprzez aktualizację MinGW. Procedurę wykonania tej czynności można znaleźć w sekcji Code::Blocks w lekcja 0.6 -- Instalowanie zintegrowanego środowiska programistycznego (IDE).

Wskazówka

Po aktualizacji MinGW do najnowszej wersji możesz sprawdzić, czy w menu Ustawienia > Kompilator… pojawiają się pola wyboru nowszych standardów językowych. Jeśli nie, możesz ręcznie wybrać wersję C++ w następujący sposób:

  • Znajdź zakładkę „Inne opcje kompilatora” w „Globalnych ustawieniach kompilatora”. dialogowe.
  • Dodaj jedną z następujących opcji kompilatora: -std=c++11, -std=c++14, -std=c++17, -std=c++20 lub -std=c++23 (aby włączyć odpowiednio obsługę C++11/14/17/20/23). Możesz także wypróbować najnowszą nazwę kodową (np. -std=c++2c) w celu eksperymentalnego wsparcia funkcji z nadchodzącego standardu językowego.

Ustawianie standardu językowego w GCC/G++/Clang

Dla GCC/G++/Clang możesz użyć opcji kompilatora -std=c++11, -std=c++14, -std=c++17, -std=c++20 lub -std=c++23 (aby włączyć odpowiednio obsługę C++11/14/17/20/23). Jeśli masz GCC 8 lub 9, będziesz musiał zamiast tego użyć -std=c++2a do obsługi C++ 20. Możesz także wypróbować najnowszą nazwę kodową (np. -std=c++2c) w celu eksperymentalnego wsparcia funkcji z nadchodzącego standardu językowego.

Ustawianie standardu językowego dla VS Code

W przypadku VS Code możesz postępować zgodnie z powyższymi zasadami dotyczącymi ustawiania standardu językowego w GCC/G++/Clang.

Umieść odpowiednią flagę standardu językowego (łącznie z cudzysłowami i przecinkiem) w tasks.json plik konfiguracyjny, w "args" w osobnej linii przed "${file}".

Chcemy także skonfigurować technologię Intellisense tak, aby korzystała z tego samego standardu językowego. W przypadku C++20 w settings.json zmień lub dodaj następujące ustawienie w osobnej linii: "C_Cpp.default.cppStandard": "c++20".

Jakiego standardu językowego używa obecnie mój kompilator?

Zostało to przeniesione do następnej lekcji. Zobacz 0.13 — Jakiego standardu językowego używa mój kompilator?.

Eksportowanie konfiguracji

Konieczność ponownego wybierania wszystkich opcji ustawień za każdym razem, gdy tworzysz nowy projekt, jest uciążliwa. Na szczęście większość IDE umożliwia eksport ustawień. Zwykle odbywa się to poprzez utworzenie nowego szablonu projektu z żądanymi ustawieniami, a następnie wybranie tego szablonu projektu podczas tworzenia nowego projektu.

W przypadku użytkowników programu Visual Studio

W Visual Studio ta opcja jest dostępna poprzez Projekt -> Eksportuj szablon. Wybierz „Szablon projektu”, dodaj nazwę i opcjonalny opis (np. aplikacja konsolowa C++20), a następnie kliknij „Zakończ”.

Gdy następnym razem utworzysz nowy projekt, zobaczysz ten szablon na liście szablonów projektów.

Gdy utworzysz nowy projekt przy użyciu tego szablonu, może on nie otwierać żadnych plików. Możesz otworzyć plik .cpp w oknie Eksploratora rozwiązań, przechodząc do opcji Rozwiązanie -> <Nazwa projektu> -> Pliki źródłowe -> <nazwa szablonu>.cpp.

Luty 2025: Czytelnik Mingtao Yue uprzejmie zostawił komentarz podając kilka obejść kilku błędów w tej funkcji.

W przypadku użytkowników Code::Blocks

W Code::Blocks, wybierz Plik -> Zapisz projekt jako szablon. Nadaj szablonowi tytuł i zapisz.

Gdy tworzysz nowy projekt, znajdziesz ten szablon w opcji „Szablony użytkownika”.

Gdzie mogę zobaczyć dokument standardów C++?

Każdy standard języka C++ jest opisany w dokumencie standardów, który jest formalnym dokumentem technicznym będącym wiarygodnym źródłem reguł i wymagania danego standardu językowego. Dokument standardów nie jest przeznaczony do nauki — jest raczej przeznaczony dla twórców kompilatorów, aby mogli dokładnie wdrażać nowe standardy językowe. Czasami zobaczysz osoby cytujące dokument standardów, wyjaśniając, jak coś działa.

Zatwierdzony dokument standardów C++ dla danego standardu językowego nie jest dostępny bezpłatnie. Istnieje link do zakupu najnowszego standardu tutaj.

W przypadku opracowywania nowego standardu językowego publikowane są projekty dokumentów standardów do przeglądu. Wersje robocze dostępne są bezpłatnie online. Ostatni projekt normy przed zatwierdzoną normą jest na ogół wystarczająco zbliżony do oficjalnej normy, aby można ją było stosować w większości celów. Można znaleźć projekty standardów tutaj.

Kompilatory często nie w pełni obsługują nowe funkcje językowe

Nawet po sfinalizowaniu standardu językowego w kompilatorach obsługujących ten standard językowy często nadal brakuje, jest częściowa lub zawiera błędy obsługa niektórych funkcji.

Jeśli próbujesz skompilować program, który powinien się skompilować, ale w tajemniczy sposób się nie da, dzieje się tak prawdopodobnie z jednego z dwóch powodów:

  • Twój kompilator jest skonfigurowany do używania starszego standardu językowego, który nie obsługuje używanej funkcji. Spróbuj wybrać nowszy standard językowy i skompiluj program ponownie. Możesz użyć programu w lekcji 0.13 — Jakiego standardu językowego używa mój kompilator? aby sprawdzić, czy poprawnie skonfigurowałeś wybór standardu językowego.
  • Wersja kompilatora, którego używasz, może nie zawierać, częściowej lub błędnej obsługi używanej funkcji.

Witryna internetowa CPPReference śledzi obsługę kompilatora dla każdej funkcji według standardu językowego. Linki do tych tabel wsparcia znajdziesz na ich stronie głównej, w prawym górnym rogu, w sekcji „Obsługa kompilatora” (według standardu językowego). Na przykład możesz zobaczyć, które funkcje C++23 są obsługiwane tutaj.

Jeśli nowsza wersja Twojego kompilatora obsługuje problematyczną funkcję, możesz zaktualizować kompilator do najnowszej wersji i spróbować ponownie skompilować program. Jeśli najnowsza wersja Twojego kompilatora w dalszym ciągu nie obsługuje funkcji, której próbujesz użyć, możesz wypróbować inny kompilator, który zapewnia obsługę, lub znaleźć rozwiązanie wykorzystujące inny zestaw funkcji.

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
646 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze