Zgodność języka Microsoft C/C++ z wersją programu Visual Studio
Artykuł
Zgodność ze standardami kompilatora microsoft C/C++ w programie Visual Studio (MSVC) jest w toku. Poniżej przedstawiono podsumowanie zgodności języka ISO Standard C i C++ i biblioteki z wersją programu Visual Studio. Każda nazwa funkcji kompilatora języka C++ i standardowej biblioteki zawiera link do dokumentu propozycji STANDARD C++ ISO, który opisuje tę funkcję, gdy jest dostępny w czasie publikacji. W kolumnie Obsługiwane jest wyświetlana wersja programu Visual Studio, w której po raz pierwszy pojawiła się obsługa funkcji.
Grupa dokumentów wymienionych razem wskazuje funkcję standardową wraz z co najmniej jednym zatwierdzonym ulepszeniami lub rozszerzeniami. Te funkcje są implementowane razem.
Nie zaimplementowano jeszcze. Częściowa implementacja jest niekompletna. Aby uzyskać więcej informacji, zobacz sekcję Uwagi . Program VS 2010 obsługiwany w programie Visual Studio 2010. Program VS 2013 obsługiwany w programie Visual Studio 2013. Program VS 2015 obsługiwany w programie Visual Studio 2015 (RTW). Programy VS 2015.2 i VS 2015.3 wskazują funkcje obsługiwane odpowiednio w programach Visual Studio 2015 Update 2 i Visual Studio 2015 Update 3. Program VS 2017 15.0 obsługiwany w programie Visual Studio 2017 w wersji 15.0 (RTW). Program VS 2017 15.3 obsługiwany w programie Visual Studio 2017 w wersji 15.3. Program VS 2017 15.5 obsługiwany w programie Visual Studio 2017 w wersji 15.5. Program VS 2017 15.7 obsługiwany w programie Visual Studio 2017 w wersji 15.7. Program VS 2019 16.0 obsługiwany w programie Visual Studio 2019 w wersji 16.0 (RTW). Program VS 2019 16.1 obsługiwany w programie Visual Studio 2019 w wersji 16.1. Program VS 2019 16.2 obsługiwany w programie Visual Studio 2019 w wersji 16.2. Program VS 2019 16.3 obsługiwany w programie Visual Studio 2019 w wersji 16.3. Program VS 2019 16.4 obsługiwany w programie Visual Studio 2019 w wersji 16.4. Program VS 2019 16.5 obsługiwany w programie Visual Studio 2019 w wersji 16.5. Program VS 2019 16.6 obsługiwany w programie Visual Studio 2019 w wersji 16.6. Program VS 2019 16.7 obsługiwany w programie Visual Studio 2019 w wersji 16.7. Program VS 2019 16.8 obsługiwany w programie Visual Studio 2019 w wersji 16.8. Program VS 2019 16.9 obsługiwany w programie Visual Studio 2019 w wersji 16.9. Program VS 2019 16.10 obsługiwany w programie Visual Studio 2019 w wersji 16.10. Program VS 2022 17.0 obsługiwany w programie Visual Studio 2022 w wersji 17.0. PROGRAM VS 2022 17.1 obsługiwany w programie Visual Studio 2022 w wersji 17.1. Program VS 2022 17.2 obsługiwany w programie Visual Studio 2022 w wersji 17.2. Program VS 2022 17.3 obsługiwany w programie Visual Studio 2022 w wersji 17.3. Program VS 2022 17.4 obsługiwany w programie Visual Studio 2022 w wersji 17.4. Program VS 2022 17.5 obsługiwany w programie Visual Studio 2022 w wersji 17.5.
Uwagi
A W /std:c++14 trybie specyfikacje wyjątków dynamicznych pozostają niezaimplementowane i throw() nadal są traktowane jako synonim dla programu __declspec(nothrow). W języku C++17 specyfikacje wyjątków dynamicznych zostały w większości usunięte przez P0003R5, z wyjątkiem jednej kamizelki: throw() jest przestarzałe i musi zachowywać się jako synonim dla elementu noexcept. W /std:c++17 trybie MSVC jest teraz zgodny ze standardem, dając throw() takie samo zachowanie jak noexcept, czyli wymuszanie za pośrednictwem zakończenia.
Opcja /Zc:noexceptTypes kompilatora żąda starego zachowania klasy __declspec(nothrow). throw() Prawdopodobnie zostanie usunięta w przyszłej wersji języka C++. Aby ułatwić migrację kodu w odpowiedzi na te zmiany w implementacji standardu i implementacji firmy Microsoft, nowe ostrzeżenia kompilatora dotyczące problemów ze specyfikacją wyjątków są dodawane w obszarze /std:c++17 i /permissive-.
C W programie Visual Studio 2019 w wersji 16.6 lub nowszej kompilator w pełni implementuje standardowy preprocesor C99 za pośrednictwem /Zc:preprocessor opcji . (W programie Visual Studio 2017 w wersji 15.8 do 16.5 kompilator obsługuje standardowy preprocesor C99 za pośrednictwem opcji kompilatora /experimental:preprocessor ). Ta opcja jest domyślnie włączona, gdy opcja /std:c11 kompilatora lub /std:c17 jest określona.
D Obsługiwane w obszarze /std:c++14 z pomijalnym ostrzeżeniem: C4984.
E Implementacja jest wystarczająca do obsługi standardowej biblioteki języka C++20. Kompletna implementacja wymaga zmiany powodującej niezgodność binarną.
F Funkcje usunięte po określeniu opcji kompilatora lub nowszego/std:c++17. Aby ponownie włączyć te funkcje (aby ułatwić przejście do nowszych trybów języka), użyj tych makr: _HAS_AUTO_PTR_ETC, , _HAS_FUNCTION_ALLOCATOR_SUPPORT_HAS_OLD_IOSTREAMS_MEMBERSi _HAS_UNEXPECTED.
G Biblioteka algorytmów równoległych języka C++17 została ukończona. Ukończone nie oznacza, że każdy algorytm jest równoległy w każdym przypadku. Najważniejsze algorytmy zostały zrównoleglizowane. Podpisy zasad wykonywania są udostępniane nawet wtedy, gdy implementacja nie wykonuje równoległości algorytmów. Centralny nagłówek <yvals_core.h>wewnętrzny, , zawiera następujące "Parallel Algorithms Notes": C++ umożliwia implementacji implementowanie algorytmów równoległych jako wywołań do algorytmów seryjnych. Ta implementacja zrównalizuje kilka typowych wywołań algorytmów, ale nie wszystkich.
Te algorytmy nie wykazują zauważalnej poprawy wydajności równoległości na sprzęcie docelowym. Wszystkie algorytmy, które tylko kopiują lub permutują elementy bez gałęzi, zwykle mają ograniczoną przepustowość pamięci:
H Jest to całkowicie nowa implementacja, niezgodna z poprzednią std::experimental wersją, wymagana przez obsługę linków symlinkowych, poprawki błędów i zmiany w standardowym zachowaniu. Obecnie udostępnia zarówno nowestd::filesystem, <filesystem> jak i poprzednie std::experimental::filesystem. Nagłówek <experimental/filesystem> zawiera tylko starą implementację eksperymentalną. Spodziewaj się usunięcia eksperymentalnej implementacji w następnej wersji bibliotek powodującej niezgodność z architekturą ABI.
Ja Obsługiwane przez funkcję wewnętrzną kompilatora.
Jstd::byte program jest włączony przez /std:c++17 program lub nowszy, ale ponieważ może powodować konflikt z nagłówkami zestawu Windows SDK w niektórych przypadkach, ma szczegółowe makro rezygnacji. Aby ją wyłączyć, zdefiniuj _HAS_STD_BYTE jako 0.
K MSVC nie obsługuje słowa kluczowego _Complex ani natywnych typów złożonych. Uniwersalne CRT <complex.h> używa makr specyficznych dla implementacji, aby osiągnąć ten sam efekt. Aby uzyskać więcej informacji, zobacz Obsługa złożonych obliczeń matematycznych w języku C.
L Technologia Universal CRT nie implementuje modyfikatorów konwersji alternatywnej strftimeE i O . Te modyfikatory są ignorowane (na przykład %Oe zachowuje się tak samo jak %e). Modyfikatory nie są obsługiwane przez bazowe interfejsy API ustawień regionalnych.
M Universal CRT nie implementuje C11aligned_alloc, ale zapewnia _aligned_malloc i _aligned_free. Ponieważ system operacyjny Windows nie obsługuje wyrównanych alokacji, ta funkcja jest mało prawdopodobne, aby została zaimplementowana.
N Deklaracja jest usuwana, ale eksport funkcji pozostaje zgodny z poprzednimi wersjami.
O Niektóre funkcje sprawdzania granic są nieimplementowane lub mają różne podpisy lub nie są częścią standardu C11 lub C17. Te funkcje są nieimplementowane: abort_handler_s, , ignore_handler_s, set_constraint_handler_smemset_s, snprintf_s, snwprintf_s, strerrorlen_s. vsnwprintf_s Te funkcje mają różne podpisy: gmtime_s, , qsort_slocaltime_s, strtok_s, vsnprintf_s, wcstok_s. Te funkcje nie są wyświetlane w warstwie Standardowa: clearerr_s, fread_s.
P Dodano obsługę w programie Visual Studio 2019 w wersji 16.10. Dodano obsługę języka Clang w programie Visual Studio 2022 w wersji 17.0.
Q Spowoduje to usunięcie declare_reachable, , undeclare_reachable, declare_no_pointers, undeclare_no_pointers. get_pointer_safety Wcześniej te funkcje nie miały wpływu.
R Jest to powszechna zmiana powodująca niezgodność źródła. Jednak kod, który wcześniej miał niezdefiniowane zachowanie w czasie wykonywania, jest teraz odrzucany z błędami kompilatora.
S Adaptery zakresu wejściowego i counted_iterator są implementowane w programie VS 2022 17.0. Planowana jest przyszła aktualizacja programu Visual Studio 2019 w wersji 16.11 w celu uwzględnienia tych zmian.
T<stdatomic.h> program jest obecnie obsługiwany w przypadku kompilacji jako C++ (/std:c++latest). Nie jest jeszcze obsługiwany podczas kompilowania jako C (/std:c11 i /std:c17)
14 Te funkcje C++17 i C++20 są zawsze włączone, nawet jeśli /std:c++14 (wartość domyślna) jest określona. Przyczyną jest to, że funkcja została zaimplementowana przed wprowadzeniem /std opcji lub dlatego, że implementacja warunkowa była niezaprzeczalnie złożona.
17 Te funkcje są włączane przez opcję kompilatora lub nowszego/std:c++17.
20 W wersjach za pośrednictwem programu Visual Studio 2019 w wersji 16.10 te funkcje są włączone przez opcję kompilatora/std:c++latest. Program Visual Studio 2019 w wersji 16.11 dodał opcję kompilatora /std:c++20 , aby włączyć te funkcje.
20abi Ze względu na ciągłe prace po wydaniu w standardzie C++20 , <format>części formatowania (które opierają się na <format>), oraz fabryki zakresów <chrono> i adaptery zakresu od <ranges> (wszystko, co wymaga view koncepcji) są dostępne tylko w obszarze /std:c++latest. Spodziewaj się, że te funkcje zostaną /std:c++20 osiągnięte po osiągnięciu porozumienia z usługą WG21, że nie są konieczne żadne dalsze zmiany powodujące niezgodność ABI. Pozostałe części <chrono> algorytmów i stosowane do zakresów są włączone w /std:c++20 ramach opcji kompilatora w programie Visual Studio 2019 w wersji 16.11 lub nowszej.
23 W programie Visual Studio 2022 w wersji 17.0 i nowszej te funkcje są włączone przez opcję kompilatora/std:c++latest.
C11 Obsługa kompilatora C11 i C17 wymaga programu Visual Studio 2019 w wersji 16.8 lub nowszej. Z wyjątkiem tego, że obsługa bibliotek C11 i C17 wymaga zestawu Windows SDK kompilacji 10.0.20211.0 lub nowszej. Aby uzyskać więcej informacji na temat sposobu instalowania obsługi C11 i C17, zobacz Instalowanie obsługi C11 i C17 w programie Visual Studio.
DR Te funkcje są włączone we wszystkich trybach opcji kompilatora języka C++/std. Komitet standardowy języka C++ przyjął tę zmianę jako wsteczny raport o wadach dla języka C++11 i wszystkich nowszych wersji.
2104 Obsługa biblioteki C11 dla tej funkcji wymaga zestawu Windows SDK kompilacji 10.0.20348.0 (wersja 2104) lub nowszej.