Co nowego w języku C++ w programie Visual Studio

Visual Studio 2019 r. wprowadza wiele aktualizacji i poprawek do środowiska Microsoft C++. Naprawiliśmy wiele usterek i problemów w kompilatorze i narzędziach. Wiele z tych problemów zostało przesłanych przez klientów za pośrednictwem opcji Zgłoś problem i Prześlij sugestię w obszarze Wyślij opinię. Dziękujemy za zgłaszanie usterek!

Aby uzyskać więcej informacji na temat nowości w wszystkich Visual Studio, odwiedź stronę Co nowego w programie Visual Studio 2019. Aby uzyskać informacje na temat nowości dotyczących języka C++ w programie Visual Studio 2017, zobacz What's new for C++ in Visual Studio 2017. Aby uzyskać informacje na temat nowości dotyczących języka C++ w programie Visual Studio 2015 i starszych wersjach, zobacz Visual C++ What's New 2003 to 2015 (Co nowego w latach 2003–2015). Aby uzyskać informacje o nowościach w witrynie C++ docs, zobacz Microsoft C++ docs: What's new.

Co nowego w języku C++ w Visual Studio wersji 16.9

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.9, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.9.

  • Adres Sanitizer:

    • Obsługa usługi sanitizer adresów na Windows jest poza trybem eksperymentalnym i osiągnęła ogólną dostępność.

    • Rozszerzona RtlAllocateHeap obsługa, rozwiązano problem ze zgodnością z RtlCreateHeap RtlAllocateHeap interceptorami i podczas tworzenia wykonywalnych pul pamięci.

    • Dodano obsługę starszej wersji GlobalAlloc i LocalAlloc rodziny funkcji pamięci. Te interceptory można włączyć, ustawiając flagę środowiska ASAN_OPTIONS=windows_hook_legacy_allocators=true .

    • Zaktualizowano komunikaty o błędach stosowane w przypadku niepowodzenia przejmowania i przeplatania pamięci w tle, aby umożliwić jawną obsługę problemów i rozwiązań.

    • Integracja środowiska IDE może teraz obsługiwać kompletną kolekcję wyjątków, które może zgłaszać rozwiązanie ASan.

    • Kompilator i program linkujący zasugerują emitowanie informacji debugowania, jeśli wykryją kompilację za pomocą narzędzia ASan, ale nie emitują informacji debugowania.

  • Można teraz określić docelową wersję llvm środowiska uruchomieniowego OpenMP przy użyciu nowego przełącznika /openmp:llvm CL. Powoduje to dodanie obsługi lastprivate klauzuli w #pragma omp sekcjach i niepodpisanych zmiennych indeksu w pętlach for równoległych. Przełącznik /openmp:llvm jest obecnie dostępny tylko dla obiektu docelowego amd64 i jest nadal eksperymentalny.

  • Visual Studio Projekty CMake mają teraz najwyższej klasy obsługę zdalnego Windows tworzenia aplikacji. Obejmuje to konfigurowanie projektu CMake do docelowego użycia w systemie Windows ARM64, wdrażanie projektu na komputerze zdalnym z systemem Windows i debugowanie projektu na komputerze zdalnym z systemem Windows z poziomu programu Visual Studio.

  • Wersja narzędzia Ninja dostarczana z programem Visual Studio w systemie Windows została zaktualizowana do wersji 1.10. Aby uzyskać więcej informacji o tym, co jest zawarte, zobacz informacje o wersji Ninja 1.10.

  • Wersja narzędzia CMake dostarczana z programem Visual Studio została zaktualizowana do wersji 3.19. Aby uzyskać więcej informacji na temat zawartych w nich informacji, zobacz informacje o wersji CMake 3.19.

  • Wiele typów blokady/ochrony w STL oznaczono jako nodiscard .

  • IntelliSense:

    • Zwiększono stabilność i udoskonalono funkcjonalność w zakresie zapewniania zaimportowanych modułów oraz uzupełniania jednostek nagłówka w funkcji IntelliSense.

    • Dodano obsługę funkcji Przejdź do definicji dla importów modułów, obsługę indeksowania dla modułu oraz dokładniejsze informacje o modułach o export {...} tej samej nazwie.

    • Poprawiono zgodność języka funkcji IntelliSense dla języka C++, dodając obsługę inicjowania kopii tymczasowego w bezpośrednim inicjowaniu odwołania i , naprawianie niespójności między funkcjami __builtin_memcpy __builtin_memmove constexpr i consteval , rozszerzone o okres istnienia tymczasowe w wyrażeniach stałych oraz podobne typy i powiązanie odwołania .

    • Dodano funkcję uzupełniania dla elementów make_unique, make_shared, emplace i emplace_back, która umożliwia uzupełnianie na podstawie określonego parametru typu.

  • Kompilator MSVC określa teraz poprawne środowiska uruchomieniowe modułu czyszczącego adresy wymagane dla plików binarnych. Projekt programu Visual Studio automatycznie pobierze nowe zmiany. W przypadku korzystania z narzędzia do czyszcza adresów w wierszu polecenia wystarczy teraz przekazać tylko /fsanitize=address dane do kompilatora.

  • Menedżer połączeń programu Visual Studio obsługuje teraz klucze prywatne przy użyciu algorytmu klucza publicznego ECDSA.

  • Zaktualizowano wersje maszyny wirtualnej niskiego poziomu i narzędzia Clang dostarczone w naszym instalatorze do wersji 11. Aby uzyskać więcej informacji, zapoznaj się z informacjami o wersji dotyczącymi maszyny wirtualnej niskiego poziomu i narzędzia Clang.

  • Program Visual Studio będzie teraz używać zmiennych narzędzia CMake z plików łańcucha narzędzi w celu skonfigurowania funkcji IntelliSense. To zapewni lepsze środowisko programowania aplikacji osadzonych i aplikacji dla systemu Android.

  • Implementacja propozycji Więcej kontenerów Constexpr, która umożliwia destruktorom i nowym wyrażeniom . constexpr Otwiera to drogę do narzędzi takich jak constexpr std::vector i std::string .

  • Rozszerzona obsługa technologii IntelliSense modułów języka C++20, w tym funkcji Przejdź do definicji, Przejdź do modułu i uzupełniania składowych.

  • Skrócone szablony funkcji są teraz obsługiwane w MSVC kompilatorze.

Co nowego w języku C++ w Visual Studio wersji 16.8

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.8, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.8.

  • Coroutines C++20 są teraz obsługiwane w obszarze /std:c++latest i <coroutine> nagłówku .

  • Funkcja IntelliSense oferuje teraz obsługę elementu <concepts> języka C++20 i nagłówków <ranges> oraz zmienianie nazw i przeglądanie definicji koncepcji.

  • Nasza biblioteka STL obsługuje teraz większość zakresów języka C++20.

  • Program MSVC obsługuje teraz warunkowo trywialne specjalne funkcje składowe.

  • C11 i C17 są teraz obsługiwane w przełącznikach /std:c11 i /std:c17 .

  • Dodatkowe ulepszenia STL obejmują pełną obsługę std::atomic_ref optymalizacji , std::midpoint std::lerp i std::execution::unseq i dla i std::reverse_copy innych.

  • Uaktualniono wersję programu CMake dostarczanego z programem Visual Studio do wersji CMake 3.18.

  • Nasze narzędzia do analizy kodu obsługują teraz standard SARIF 2.1: standardowy w branży format statycznego dziennika analizy.

  • W przypadku braku narzędzi do kompilacji w projektach systemu Linux na pasku narzędzi będzie teraz wyświetlane ostrzeżenie, a lista błędów będzie zawierać jasny opis brakujących narzędzi.

  • Teraz można debugować zrzuty pamięci systemu Linux w zdalnym systemie Linux lub podsystemie WSL bezpośrednio z poziomu programu Visual Studio.

  • W przypadku generowania komentarzy W języku C++ doxygen dodaliśmy dodatkowe opcje stylu komentarza ( /*! i //! ).

  • Dodatkowe vcpkg z ogłoszeniami.

  • Obsługa kompilatora dla lambda w nieocenionych kontekstach.

  • /DEBUG:FULL Zwiększona wydajność łącza dzięki tworzeniu pliku PDB z wieloma wątkami. W kilku dużych aplikacjach i grach AAA można zauważyć od 2 do 4 razy szybsze łączenie.

  • Debuger Visual Studio obsługuje teraz char8_t .

  • Obsługa projektów ARM64 przy użyciu clang-cl.

  • Obsługa funkcji wewnętrznych Intel AMX.

Co nowego w języku C++ w Visual Studio wersji 16.7

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.7, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.7.

  • Obsługa zdalna języka C++ obejmuje teraz szerszy zakres dystrybucji systemu Linux i powłok, w tym sh, csh, bash, tsch, ksh, zsh i dash. Można zastąpić wybór powłoki na potrzeby połączenia zdalnego, modyfikując nową właściwość „shell” przy użyciu programu ConnectionManager.exe. Obsługa została przetestowana zarówno z projektami systemu Linux opartymi na platformie MSBuild, jak i z projektami platformy CMake używanymi ze zdalnym systemem Linux lub podsystemem WSL.

  • Można teraz używać narzędzia Ninja (systemu kompilacji umożliwiającego bardzo szybką ocenę kompilacji przyrostowych), aby skrócić czas kompilacji przyrostowych dla projektów systemu Linux opartych na platformie MSBuild. Możesz wybrać tę funkcję, ustawiając właściwość „Włącz kompilację przyrostową” na wartość „Przy użyciu narzędzia Ninja” na stronie właściwości ogólnych. W zdalnym systemie Linux lub podsystemie WSL musi być zainstalowane narzędzi Ninja (ninja-build).

  • Zaimplementowano nowe funkcje biblioteki standardowej języka C++ 20. Aby uzyskać szczegółową listę, zobacz dziennik zmian biblioteki STL w witrynie GitHub.

  • Teraz można edytować i ustawiać domyślne połączenia zdalne SSH w menedżerze połączeń. Oznacza to, że można edytować istniejące połączenie zdalne (na przykład jeśli jego adres IP uległ zmianie) i ustawić domyślne połączenia do CMakeSettings.jsna i launch.vs.jswłączone. Zdalne połączenia SSH umożliwiają tworzenie i debugowanie projektów języka C++ w zdalnym systemie Linux bezpośrednio z programu Visual Studio.

  • Ulepszono obsługę funkcji IntelliSense dla kompilatora clang w systemie Windows (clang-cl) w programie Visual Studio. Ścieżka dołączania kompilatora clang uwzględnia teraz biblioteki clang, ulepszono wyświetlanie zygzaków w edytorze podczas korzystania z biblioteki std oraz dodano obsługę języka C++ 2a w trybie clang.

  • Teraz można wypróbować funkcję podkreślania błędów kodu i wyświetlić więcej sugerowanych szybkich poprawek w projektach C++. Włącz tę funkcję w obszarze Narzędzia > opcje > edytorze tekstu > C/C++ > eksperymentalne. Ustaw opcję Wyłącz linter kodu eksperymentalnego na wartość false. Więcej informacji znajduje się w blogu zespołu języka C++.

  • Dodano cztery nowe reguły analizy kodu w celu uwzględnienia dodatkowych funkcji bezpieczeństwa w języku C++: C26817, C26818, C26819 i C26820.

  • Dodano wysokiej jakości obsługę debugowania projektów CMake w systemach zdalnych za pomocą programu gdbserver.

  • Można łatwo wykrywać błędy uszkodzeń pamięci dzięki eksperymentalnej implementacji elementu AddressSanitizer dla języka C++ w programie Visual Studio, która jest teraz dostępna dla projektów natywnych x64. Teraz obsługujemy również korzystanie ze środowisk uruchomieniowych debugowania /MTd (, /MDd , /LDd ).

  • Funkcja IntelliSense obejmuje teraz podstawową obsługę pojęć, wyznaczonych inicjatorów i kilku innych funkcji języka C++20.

  • .ixx Pliki i są teraz rozpoznawane jako C++ i traktowane jako .cppm takie przez wyróżnianie składni i intelliSense.

Co nowego w języku C++ w Visual Studio wersji 16.6

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.6, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.6.

  • Ulepszono generowanie komentarzy Doxygen/XML: Automatycznie generuj wycinki komentarzy do dokumentów Doxygen lub XML, wpisując /// lub /** powyżej funkcje. Są one teraz wyświetlane także w etykietkach Szybka podpowiedź.

  • Obsługa narzędzia Ninja w narzędziu CMake dla systemu Linux/WSL: Używaj narzędzia Ninja jako bazowego generatora podczas kompilowania projektów CMake w systemie WSL lub w systemie zdalnym. Ninja jest teraz domyślnym generatorem podczas dodawania nowej konfiguracji systemu Linux lub WSL.

  • Szablony debugowania na potrzeby zdalnego debugowania narzędzia CMake: Uproszczono szablony służące do debugowania projektów narzędzia CMake w zdalnym systemie Linux lub WSL z gdb.

  • Wstępna obsługa pojęć języka C++20: Funkcja IntelliSense rozpoznaje teraz pojęcia języka C++20 i sugeruje je na liście elementów członkowskich.

Co nowego w języku C++ w Visual Studio wersji 16.5

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.5, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.5.

  • Obsługa modelu uzupełniania zespołu i zmiennych członkowskich funkcji IntelliCode: Deweloperzy języka C++ mogą teraz szkolić modele funkcji IntelliCode we własnych bazach kodu. Nazywamy to modelem uzupełniania zespołów, ponieważ korzystasz z rozwiązań Twojego zespołu. Ponadto ulepszono sugestie funkcji IntelliCode dotyczące zmiennych członkowskich.

  • Ulepszenia funkcji IntelliSense:

    • Funkcja IntelliSense wyświetla teraz bardziej czytelne nazwy typów podczas pracy z biblioteką standardową.
    • Dodaliśmy możliwość przełączania funkcji Enter, Spacja i Tab jako znaków zatwierdzenia oraz przełączania, czy klawisz Tab jest używany do wstawiania fragmentu kodu. Te ustawienia można znaleźć w obszarze Narzędzia > opcje > edytorze tekstu > C/C++> Zaawansowane > IntelliSense.
  • Menedżer połączeń w wierszu polecenia: Możesz teraz wchodzić w interakcje z przechowywanymi połączeniami zdalnymi za pośrednictwem wiersza polecenia. Jest to przydatne w przypadku zadań, takich jak aprowizowanie nowej maszyny dewelopera lub Visual Studio w ciągłej integracji.

  • Debugowanie i wdrażanie dla systemu WSL: Użyj Visual Studio systemu WSL, aby oddzielić system kompilacji od systemu zdalnego wdrażania. Teraz możesz natywnie kompilować w systemie WSL i wdrażać artefakty kompilacji w drugim zdalnym systemie na potrzeby debugowania. Ten przepływ pracy jest obsługiwany przez projekty języka CMake i projekty systemu Linux oparte na platformie MSBuild.

  • Obsługa trybu zgodności ze standardem FIPS 140-2: program Visual Studio obsługuje teraz tryb zgodności ze standardem FIPS 140-2 podczas tworzenia aplikacji C++ dla zdalnego systemu Linux.

  • Usługi językowe dla plików języka CMake i lepsze manipulowanie projektami CMake:

    • Zoptymalizowano kopię pliku źródłowego dla projektów CMake przeznaczonych dla zdalnego systemu Linux. Program Visual Studio zachowuje teraz „plik odcisku palca” ostatniego zestawu źródeł, który jest domyślnie kopiowany, i optymalizuje zachowanie na podstawie liczby zmienionych plików.

    • Funkcje nawigowania po kodzie, takie jak przechodzenie do definicji oraz znajdowanie wszystkich odwołań, są teraz obsługiwane dla funkcji, zmiennych i elementów docelowych w plikach skryptów CMake.

    • Dodawaj, usuwaj i zmieniaj nazwy plików oraz elementów docelowych w projektach platformy CMake z poziomu środowiska IDE bez konieczności ręcznego edytowania skryptów CMake. Po dodaniu lub usunięciu plików w Eksploratorze rozwiązań program Visual Studio będzie automatycznie edytować projekt platformy CMake. Można również dodawać i usuwać elementy docelowe projektu oraz zmieniać ich nazwy z widoku elementów docelowych w Eksploratorze rozwiązań.

  • Ulepszenia projektu systemu Linux: Visual Studio w systemie Linux mają teraz dokładniejszą funkcję IntelliSense i umożliwiają sterowanie zdalną synchronizacją nagłówków dla większej liczby projektów.

Co nowego w języku C++ w Visual Studio wersji 16.4

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.4, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.4.

  • Code Analysis teraz natywnie obsługuje projekty MSBuild i CMake, niezależnie od tego, czy używasz zestawu narzędzi Clang-Tidy Clang, czy MSVC narzędzi. Testy zgodności z oprogramowaniem Clang mogą być uruchamiane w ramach analizy kodu w tle, wyświetlane jako ostrzeżenia w edytorze (zygzaki) i wyświetlane na liście błędów.

  • Projekty Visual Studio CMake zawierają teraz strony Przegląd, które ułatwiają rozpoczęcie tworzenia aplikacji dla wielu platform. Te strony są dynamiczne i ułatwiają połączenie z systemem Linux oraz dodanie konfiguracji systemu Linux lub podsystemu WSL do projektu CMake.

  • Menu rozwijane uruchamiania dla projektów CMake zawiera teraz ostatnio używane elementy docelowe i można je filtrować.

  • Język C++/CLI obsługuje teraz międzyoperacyjność z platformą .NET Core w wersji 3.1 i wyższych w systemie Windows.

  • Możesz teraz włączyć narzędzie ASan dla projektów skompilowanych przy użyciu kompilatora MSVC w systemie Windows na potrzeby instrumentacji w czasie działania kodu C++, co ułatwia wykrywanie błędów pamięci.

  • Aktualizacje standardowej biblioteki języka C++ kompilatora MSVC:

    • C++17: Zaimplementowano ogólną precyzję to_chars(), zgodnie ze standardem P0067R5 podstawowej konwersji ciągów (charconv). Stanowi to uzupełnienie implementacji wszystkich funkcji biblioteki standardu C++17.
    • C++20: Zaimplementowano standard P1754R1 dotyczący koncepcji zmiany nazw na standard_case. Aby uwzględnić funkcje w wersji zapoznawczej z najnowszej wersji roboczej języka C++, użyj /std:c++latest opcji kompilatora. Tę opcję można również ustawić na stronie właściwości projektu C/C++ > właściwości Właściwości konfiguracji języka C/C++ > przy użyciu właściwości Standard języka C++.
  • Dostępna jest nowa kolekcja narzędzi o nazwie C++ Build Szczegółowe informacje. Aby uzyskać więcej informacji o anonsie, zobacz blog zespołu języka C++.

Co nowego w języku C++ w Visual Studio wersji 16.3

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w wersji 16.3 programu Visual Studio, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.3.

  • Deweloperzy języka C++ mogą teraz przełączać komentarze wiersza przy użyciu skrótu klawiaturowego Ctrl+K, Ctrl+/.

  • Listy członków funkcji IntelliSense są teraz filtrowane na podstawie kwalifikatorów typów, teraz const std::vector filtrują metody, takie jak push_back .

  • Dodaliśmy te funkcje biblioteki standardowej języka C++20 w wersji zapoznawczej (dostępne w obszarze /std:c++latest ):

    • P0487R1: Naprawianie elementu operator>>(basic_istream&, CharT*)
    • P0616R0: Używanie metody move() w elementach <numeric>
    • P0758R1: is_nothrow_convertible
    • P0734R0: Rozszerzenia języka C++ dla koncepcji
    • P0898R3: Koncepcje dotyczące biblioteki standardowej
    • P0919R3: Wyszukiwanie heterogeniczne dla nieuporządkowanych kontenerów
  • Nowe podstawowe wskazówki dotyczące języka C++— sprawdza , w tym nowy zestaw reguł "Reguły wyliczek" oraz dodatkowe const reguły typów , i enum .

  • Nowy domyślny schemat kolorowania semantycznego umożliwia użytkownikom lepsze szybkie zrozumienie kodu, okno stosu wywołań jest skonfigurowane, aby argumenty szablonu były ukrywane, a rozszerzenie IntelliCode dla języka C++ jest domyślnie włączone.

  • Konfiguruj elementy docelowe debugowania i zadania niestandardowe ze zmiennymi środowiskowymi przy użyciu plików CMakeSettings.json lub CppProperties.json lub nowego tagu „ENV” dla poszczególnych celów i zadań w plikach launch.vs.json i tasks.vs.json.

  • Użytkownicy mogą teraz użyć szybkiej akcji w przypadku brakujących pakietów narzędzia vcpkg, aby automatycznie otworzyć konsolę i zainstalować je w domyślnej instalacji narzędzia vcpkg.

  • Zdalna kopia nagłówka wykonywana przez projekty dla systemu Linux (CMake i MSBuild) została zoptymalizowana i jest teraz uruchamiana równolegle.

  • Natywna obsługa podsystemu WSL w programie Visual Studio obsługuje teraz równoległe kompilowanie projektów dla systemu Linux opartych na programie MSBuild.

  • Użytkownicy mogą teraz określić listę lokalnych danych wyjściowych kompilacji do wdrożenia w systemie zdalnym przy użyciu projektów pliku reguł programu make dla systemu Linux.

  • Opisy ustawień w Edytorze ustawień narzędzia CMake zawierają teraz więcej kontekstu i linki do przydatnej dokumentacji.

  • Podstawowy model języka C++ dla funkcji IntelliCode jest teraz domyślnie włączony. To ustawienie można zmienić, przechodząc do obszaru Narzędzia > Opcje > IntelliCode.

Co nowego w języku C++ w Visual Studio wersji 16.2

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.2, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.2.

  • W przypadku lokalnych projektów CMake skonfigurowanych przy użyciu oprogramowania Clang analiza kodu przeprowadza teraz kontrole zgodności z oprogramowaniem Clang, które wyglądają jak część analizy kodu w tle w formie ostrzeżeń w edytorze (zygzaki) i na liście błędów.

  • Zaktualizowano nagłówek <charconv> konwersji ciągów podstawowych P0067R5 środowiska C++17:

    • Dodano przeciążenia zmiennoprzecinkowe to_chars() dla precyzji chars_format::fixed i chars_format::scientific (chars_format::general precision jest jedyną częścią, której jeszcze nie zaimplementowano)
    • Zoptymalizowano najkrótszy element chars_format::fixed
  • Dodano następujące funkcje standardowej biblioteki języka C++20 w wersji zapoznawczej:

    • Dostępne w obszarze /std:c++latest :
      • P0020R6: atomic<floating-point>
      • P0463R1:  wyliczenie endian
      • P0482R6: typ char8_t dla ciągów i znaków UTF-8
      • P0653R2: to_address() do konwersji wskaźnika na wskaźnik podstawowy
    • Dostępne w elemencie /std:c++17 i /std:c++latest:
      • P0600R1: [[nodiscard]] w bibliotece
    • Dostępne bezwarunkowo:
      • P0754R2: nagłówek <version>
      • P0771R1: konstruktor przenoszenia std::function powinien mieć wartość noexcept
  • Zestaw Windows SDK nie jest już zależnością składników CMake dla systemu Windows i CMake dla systemu Linux.

  • Ulepszenia konsolidatora języka C++ znacznie skracające czas kompilacji iteracji w przypadku dużej ilości danych wejściowych. /DEBUG:FAST Wartości i są średnio dwa razy szybsze, a teraz /INCREMENTAL są od trzech do sześciu razy /DEBUG:FULL szybsze.

Co nowego w języku C++ w Visual Studio wersji 16.1

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.1, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.1.

kompilator C++

  • Te funkcje języka C++20 w wersji zapoznawczej zostały zaimplementowane w kompilatorze języka C++ i są dostępne w obszarze /std:c++latest :

    • Zwiększona zdolność znajdowania szablonów funkcji za pomocą zależnego od argumentów wyszukiwania wyrażeń wywołania funkcji przy użyciu jawnych argumentów szablonu (P0846R0).
    • Wyznaczone inicjowanie(P0329R4),które umożliwia wybrane określone elementy członkowskie w inicjalizacji agregacji, na przykład przy użyciu Type t { .member = expr } składni .
  • Obsługa wyrażeń lambda została przebudowana w celu naprawienia dużej liczby długotrwałych usterek. Ta zmiana jest domyślnie włączona w przypadku korzystania z programu /std:c++latest . W trybie języka i w trybie domyślnym () nowy /std:c++17 parser można włączyć przy użyciu funkcji /std:c++14 /experimental:newLambdaProcessor , na przykład /std:c++17 /experimental:newLambdaProcessor .

Ulepszenia standardowej biblioteki C++

  • Te funkcje języka C++20 w wersji zapoznawczej zostały dodane do implementacji standardowej biblioteki C++ dostępnej w obszarze /std:c++latest :
    • starts_with i ends_with dla basic_string i basic_string_view .
    • contains dla kontenerów asocjacyjnych.
    • remove, remove_if i unique dla obiektów list i forward_list zwracają teraz obiekt size_type.
    • shift_left i shift_right dodane do obiektu <algorithm>.

Środowisko IDE języka C++

IntelliCode dla języka C++

Funkcja IntelliCode jest teraz dostarczana jako składnik opcjonalny w obciążeniu Tworzenie aplikacji klasycznych w języku C++. Aby uzyskać więcej informacji, zobacz Improved C++ IntelliCode now Ships with Visual Studio 2019 (Ulepszona funkcja IntelliCode języka C++ jest teraz dostarczana Visual Studio 2019).

Funkcja IntelliCode używa własnego rozbudowanych szkoleń i kontekstu kodu, aby umieścić to, czego najprawdopodobniej użyjemy, na początku listy ukończenia. Może to często wyeliminować konieczność przewijania w dół listy. W przypadku języka C++ funkcja IntelliCode oferuje najbardziej pomoc w przypadku korzystania z popularnych bibliotek, takich jak biblioteka standardowa.

Funkcje Funkcji IntelliCode w wersji zapoznawczej (modele niestandardowe, obsługa języka C++ i wnioskowanie EditorConfig) są domyślnie wyłączone. Aby je włączyć, przejdź do tematu Narzędzia > opcje > IntelliCode > Ogólne. Ta wersja funkcji IntelliCode działa z większą dokładnością i oferuje obsługę funkcji bezpłatnych. Aby uzyskać więcej informacji, zobacz AI-Assisted Code Completion Suggestions Come to C++ via IntelliCode(Sugestie dotyczące uzupełniania kodu wspomagane przez AI w języku C++ za pośrednictwem funkcji IntelliCode).

Ulepszenia szybkich informacji

  • Interfejs etykietka Szybka podpowiedź teraz przestrzegać kolorowania semantycznego edytora. Ma również nowy link Search Online, który będzie wyszukiwać dokumenty online, aby dowiedzieć się więcej na temat konstrukcji kodu po umieszczeniu wskaźnika myszy. Link podany przez szybkie informacje dla czerwonego zygniałtego kodu spowoduje wyszukanie błędu w trybie online. Dzięki temu nie trzeba ponownie wpisywania komunikatu w przeglądarce. Aby uzyskać więcej informacji, zobacz Quick Info Improvements in Visual Studio 2019: Colorization and Search Online(Szybkie ulepszenia informacji w programie Visual Studio 2019: kolorowanie i wyszukiwanie online).

Ogólne ulepszenia

  • Pasek szablonu może wypełniać menu rozwijane na podstawie wystąpień tego szablonu w bazie kodu.

  • Żarówki dla brakujących dyrektyw vcpkg które można zainstalować, i autouzupełnianie dostępnych pakietów #include dla dyrektywy find_package CMake.

  • Poprawiono stronę właściwości ogólnych dla projektów języka C++. Niektóre opcje są teraz wyświetlane na nowej stronie Zaawansowane. Strona Zaawansowane zawiera również nowe właściwości preferowanej architektury zestawu narzędzi, bibliotek debugowania, wersji pomocniczej zestawu narzędzi MSVC oraz kompilacji aparatu Unity (duże).

Obsługa CMake

  • Zaktualizowaliśmy wersję CMake dostarczaną z wersją Visual Studio do 3.14. Ta wersja dodaje wbudowaną obsługę generatorów programu MSBuild przeznaczonych dla projektów programu Visual Studio 2019 r oraz interfejsów API integracji środowiska IDE opartych na plikach.

  • Dodaliśmy ulepszenia edytora CMake Ustawienia, w tym obsługę systemu Podsystem Windows dla systemu Linux (WSL) i konfiguracji z istniejących pamięci podręcznych, zmiany domyślnych katalogów głównych kompilacji i instalacji oraz obsługę zmiennych środowiskowych w konfiguracjach CMake systemu Linux.

  • Uzupełnianie i szybkie informacje dotyczące wbudowanych poleceń, zmiennych i właściwości CMake ułatwiają edytowanie CMakeLists.txt plików.

  • Zintegrowaliśmy obsługę edytowania, budowania i debugowania projektów CMake za pomocą oprogramowania Clang/LLVM. Aby uzyskać więcej informacji, zobacz Clang/LLVM Support in Visual Studio (Obsługa clang/llvm w Visual Studio).

System Linux i Podsystem Windows dla systemu Linux

Analiza kodu

  • Dodano nowe szybkie poprawki dotyczące niezainicjowanych kontroli zmiennych. Code Analysis ostrzeżenia C6001: użycie < > niezainicjowanej zmiennej pamięci i VAR_USE_BEFORE_INIT C26494 są dostępne w menu żarówki w odpowiednich wierszach. Są one domyślnie włączone odpowiednio w minimalnym plicie reguł microsoft native i podstawowe sprawdzanie języka C++ typem reguł. Aby uzyskać więcej informacji, zobacz Nowe szybkie poprawki analizy kodu dla niezainicjowanej pamięci (C6001) i używanie ostrzeżeń przed init (C26494).

Zdalne kompilacje

  • Teraz użytkownicy mogą oddzielić maszynę zdalnej kompilacji od maszyny zdalnego debugowania w przypadku korzystania z systemu Linux, zarówno w projektach MSBuild, jak i CMake.

  • Ulepszone rejestrowanie połączeń zdalnych ułatwia diagnozowanie problemów w programowaniu na wiele platform.

Co nowego w języku C++ w Visual Studio wersji 16.0

Aby uzyskać podsumowanie nowych funkcji i poprawek błędów w programie Visual Studio w wersji 16.0, zobacz Co nowego w programie Visual Studio 2019 w wersji 16.0.

kompilator C++

  • Rozszerzona obsługa funkcji i poprawek poprawności języka C++17 oraz eksperymentalna obsługa funkcji języka C++20, takich jak moduły i coroutines. Aby uzyskać szczegółowe informacje, zobacz C++ Conformance Improvements in Visual Studio 2019.

  • Ta opcja zawiera teraz funkcje języka C++20, które nie muszą być kompletne, w tym wstępną obsługę /std:c++latest operatora C++20 ("spaceship") dla porównania <=> trzykierunkowego.

  • Przełącznik kompilatora języka C++ /Gm jest teraz przestarzały. Rozważ wyłączenie /Gm przełącznika w skryptach kompilacji, jeśli jest jawnie zdefiniowany. Można jednak bezpiecznie zignorować ostrzeżenie o cofaniu obsługi dla programu , ponieważ nie jest ono traktowane jako błąd podczas korzystania z funkcji "Traktuj ostrzeżenia /Gm jako błędy" ( /WX ).

  • Gdy MSVC implementowanie funkcji ze standardowej wersji roboczej języka C++20 w ramach flagi , jest teraz niezgodne z /std:c++latest /std:c++latest (wszystkie /clr smaki), i /ZW /Gm . W Visual Studio 2019 r. użyj trybu lub podczas kompilowania za pomocą funkcji /std:c++17 /std:c++14 , lub /clr /ZW /Gm (ale zobacz poprzedni punktor).

  • Prekompilowane nagłówki nie są już generowane domyślnie dla konsoli C++ i aplikacji klasycznych.

Codegen, security, diagnostics, and versioning (Kodowanie, zabezpieczenia, diagnostyka i wersja)

Ulepszona analiza z usługą w zakresie zapewniania pomocy w zakresie ograniczania ryzyka dla /Qspectre wariantu 1 spectre(CVE-2017-5753). Aby uzyskać więcej informacji, zobacz Ograniczanie ryzyka spectre w MSVC.

Ulepszenia standardowej biblioteki C++

  • Implementacja dodatkowych poprawek bibliotek c++17 i C++20 oraz poprawek poprawności. Aby uzyskać szczegółowe informacje, zobacz C++ Conformance Improvements in Visual Studio 2019.

  • Clang-Format zostały zastosowane do nagłówków standardowej biblioteki C++ w celu poprawy czytelności.

  • Ponieważ Visual Studio obsługuje teraz Tylko mój kod dla języka C++, biblioteka standardowa nie musi już zapewniać niestandardowych maszyn dla i w celu std::function std::visit osiągnięcia tego samego efektu. Usunięcie tych maszyn w dużej mierze nie ma widocznych dla użytkownika efektów. Jedynym wyjątkiem jest to, że kompilator nie będzie już tworzyć diagnostyki wskazującej problemy w wierszu 15732480 lub 16707566 <type_traits> polecenia lub <variant> .

Ulepszenia wydajności/przepływności w kompilatorze i bibliotece standardowej

  • Ulepszenia przepływności kompilacji, w tym sposób obsługi we/wy plików przez program linker, oraz czas łączenia w typie PDB scalanie i tworzenie.

  • Dodano podstawową obsługę wektoryzacji SIMD w programie OpenMP. Można ją włączyć przy użyciu nowego przełącznika kompilatora /openmp:experimental . Ta opcja umożliwia potencjalnie wektoryzowane pętle z #pragma omp simd adnotacjami. Wektoryzacja nie jest gwarantowana, a pętle z adnotacjami, ale nie wektoryzowane, otrzymają zgłoszone ostrzeżenie. Klauzule SIMD nie są obsługiwane; Są one ignorowane i jest zgłaszane ostrzeżenie.

  • Dodano nowy inlining przełącznik wiersza polecenia /Ob3 , który jest bardziej agresywną wersją systemu /Ob2 . /O2 (Optymalizacja pliku binarnego pod kątem szybkości) nadal /Ob2 domyślnie oznacza. Jeśli uważasz, że kompilator nie działa wystarczająco agresywnie, rozważ /O2 -Ob3 przekazanie .

  • Dodaliśmy obsługę funkcji wewnętrznych biblioteki SVML (Short Vector Math Library). Te funkcje obliczą 128-bitowe, 256-bitowe lub 512-bitowe odpowiedniki wektorowe. Dodaliśmy je w celu obsługi wektoryzacji ręcznej pętli z wywołaniami funkcji bibliotek matematycznych i niektórych innych operacji, takich jak dzielenie liczb całkowitych. Aby uzyskać definicje obsługiwanych funkcji, zobacz Intel Intrinsic Guide (Przewodnik wewnętrzny firmy Intel).

  • Nowe i ulepszone optymalizacje:

    • Składanie stałe i uproszczenia arytmetyczne dla wyrażeń korzystających z funkcji wewnętrznych wektorów SIMD dla formularzy liczb zmiennoprzecinkowy i całkowitych.

    • Bardziej zaawansowana analiza wyodrębniania informacji z przepływu sterowania (instrukcje if/else/switch) w celu usuwania gałęzi zawsze udowodniono, że są prawdziwe lub fałszywe.

    • Ulepszono odwijanie zestawu memset w celu używania instrukcji wektorowych SSE2.

    • Ulepszone usuwanie bezużyteczne kopie struktury/klasy, szczególnie w przypadku programów języka C++, które przechodzą przez wartość.

    • Ulepszona optymalizacja kodu przy memmove użyciu funkcji , takiej jak lub i std::copy std::vector std::string konstrukcji.

  • Zoptymalizowano projekt fizyczny biblioteki standardowej, aby uniknąć kompilowania części biblioteki standardowej, które nie są bezpośrednio uwzględniane. Ta zmiana obcięła czas kompilacji pustego pliku, który zawiera tylko <vector> połowę. W związku z tym może być konieczne dodanie dyrektyw #include dla nagłówków, które zostały wcześniej pośrednio uwzględnione. Na przykład kod, który używa , std::out_of_range może teraz wymagać dodania . #include <stdexcept> Kod, który używa operatora wstawiania strumienia, może teraz wymagać #include <ostream> dodania . Zaletą jest to, że tylko jednostki translacji faktycznie używające składników <stdexcept> lub <ostream> płacą koszt przepływności w celu ich skompilowania.

  • if constexpr Został zastosowany w większej liczby miejsc w bibliotece standardowej w celu zwiększenia przepływności i zmniejszenia rozmiaru kodu w operacjach kopiowania, w permutacjach, takich jak odwracanie i obracanie, oraz w bibliotece algorytmów równoległych.

  • Biblioteka standardowa używa teraz wewnętrznie programu , if constexpr aby skrócić czas kompilacji, nawet w trybie C++14.

  • Wykrywanie łączenia dynamicznego środowiska uruchomieniowego dla biblioteki algorytmów równoległych nie używa już całej strony do przechowywania tablicy wskaźników funkcji. Oznaczenie tej pamięci tylko do odczytu zostało uznane za nieoekonomione ze względów bezpieczeństwa.

  • Konstruktor nie czeka już na uruchomienie wątku i nie wstawia już tak wielu warstw wywołań funkcji między bazową biblioteką języka C a dostarczonym obiektem std::thread _beginthreadex wywoływnym. Wcześniej std::thread umieszczano sześć funkcji między _beginthreadex i dostarczonym obiektem wywoływnym. Ta liczba została zredukowana tylko do trzech, z których dwa to po prostu std::invoke . Ta zmiana rozwiązuje również usterkę chronometrażu ukrycia, gdzie konstruktor przestanie odpowiadać, jeśli zegar systemowy zmienił się dokładnie w momencie std::thread std::thread utworzenia.

  • Naprawiono regresję wydajności w std::hash programie , która została wprowadzona podczas implementowania . std::hash<std::filesystem::path>

  • Biblioteka standardowa używa teraz destruktorów zamiast bloków catch w kilku miejscach w celu osiągnięcia poprawności. Ta zmiana powoduje lepszą interakcję z debugerem: Wyjątki zgłaszane przez bibliotekę standardową w lokalizacjach, których to dotyczy, są teraz wyświetlane jako zgłaszane z ich oryginalnej lokacji zgłaszania, a nie z naszego ponownego rzutu. Nie wszystkie bloki catch biblioteki standardowej zostały wyeliminowane. Oczekujemy, że liczba bloków catch zostanie zredukowana w późniejszych wersjach MSVC.

  • Nieoptymalna funkcja codegen w programie spowodowana przez warunkowy wyjątek w funkcji została naprawiona przez std::bitset noexcept faktorowanie ścieżki zgłaszania.

  • Rodzina i używają iteratorów niez std::list std::unordered_* debugowania wewnętrznie w kolejnych miejscach.

  • Zmieniono kilka elementów członkowskich w celu ponownego użycia węzłów listy tam, gdzie to możliwe, zamiast cofniać ich alokację std::list i ponownie je rozlokować. Jeśli na przykład typ ma już rozmiar 3, wywołanie powoduje teraz zastąpienie wartości w pierwszych trzech węzłach listy i przydzielenie jednego nowego węzła listy o wartości list<int> assign(4, 1729) int 1729.

  • Wszystkie wywołania biblioteki standardowej do erase(begin(), end()) zostały zmienione na clear() .

  • std::vector Teraz inicjuje i wymazuje elementy wydajniej w niektórych przypadkach.

  • Ulepszenia w std::variant celu uprzyjaźniania go w optymalizatorze, co pozwala na lepsze wygenerowanie kodu. Wywłaszczanie kodu jest teraz znacznie lepsze w std::visit przypadku .

Środowisko IDE języka C++

Live Share Obsługa języka C++

Live Share język C++, dzięki czemu deweloperzy Visual Studio lub Visual Studio Code mogą współpracować w czasie rzeczywistym. Aby uzyskać więcej informacji, zobacz Announcing Live Share for C++: Real-Time Sharing and Collaboration (Real-Time Udostępnianie i współpraca)

Funkcja IntelliSense szablonu

Pasek szablonów używa teraz interfejsu użytkownika okna Podgląd, a nie okna modalnego, obsługuje szablony zagnieżdżone i wstępnie wypełnia wszystkie argumenty domyślne w oknie Podgląd. Aby uzyskać więcej informacji, zobacz Template IntelliSense Improvements for Visual Studio 2019 Preview 2 (Ulepszenia funkcji IntelliSense szablonu dla programu Visual Studio 2019 (wersja zapoznawcza 2). Lista rozwijana Ostatnio używane na pasku szablonów umożliwia szybkie przełączanie się między poprzednimi zestawami przykładowych argumentów.

Nowe środowisko okna uruchamiania

Podczas uruchamiania środowiska IDE zostanie wyświetlone nowe okno Uruchamiania. Oferuje ona opcje otwierania ostatnich projektów, klonowania kodu z kontroli źródła, otwierania kodu lokalnego jako rozwiązania lub folderu lub tworzenia nowego projektu. Okno dialogowe Project nowe okno dialogowe zostało również przeprojektowane w środowisko z możliwością filtrowania w pierwszej kolejności wyszukiwania.

Nowe nazwy niektórych szablonów projektów

Zmodyfikowaliśmy kilka nazw i opisów szablonów projektów, aby dopasować je do zaktualizowanego okna Project projektu.

Różne ulepszenia dotyczące produktywności

Visual Studio 2019 zawiera następujące funkcje, które ułatwiają i bardziej intuicyjne kodowanie:

  • Szybkie poprawki dla:
    • Dodaj brakujący #include
    • NULL do: nullptr
    • Dodawanie brakującego średnika
    • Rozwiązywanie problemu z brakującą przestrzenią nazw lub zakresem
    • Zastępowanie źle pośrednich operandów ( * do & i na & * )
  • Szybkie informacje dotyczące bloku przez umieszczenie wskaźnika myszy na zamykającym nawiasie klamrowy
  • Podgląd pliku nagłówka/kodu
  • Przejdź do definicji #include po otworze pliku

Aby uzyskać więcej informacji, zobacz C++ Productivity Improvements in Visual Studio 2019 Preview 2 (Ulepszenia produktywności języka C++ Visual Studio 2019 w wersji zapoznawczej 2).

Obsługa CMake

  • Obsługa CMake 3.14

  • Visual Studio można teraz otwierać istniejące pamięci podręczne narzędzia CMake generowane przez narzędzia zewnętrzne, takie jak CMakeGUI, dostosowane systemy metakompilowania lub skrypty kompilacji, które wywołują cmake.exe samodzielnie.

  • Zwiększona wydajność funkcji IntelliSense.

  • Nowy edytor ustawień stanowi alternatywę dla ręcznego edytowania pliku CMakeSettings.jsi zapewnia pewien parzystość w przypadku CMakeGUI.

  • Program Visual Studio ułatwia rozpoczęcie programowania w języku C++ za pomocą narzędzia CMake w systemie Linux, wykrywając, czy na komputerze z systemem Linux znajduje się zgodna wersja narzędzia CMake. W przeciwnym razie umożliwia jej zainstalowanie dla Ciebie.

  • Niezgodne ustawienia w ustawieniach CMakeSettings, takie jak niezgodne architektury lub niezgodne ustawienia generatora CMake, pokazują zygieł w edytorze JSON i błędy na liście błędów.

  • W projektach CMake otwieranych w środowisku IDE po uruchomieniu polecenia vcpkg integrate install automatycznie jest wykrywany i włączany łańcuch narzędzi vcpkg. To zachowanie można wyłączyć, określając pusty plik łańcucha narzędzi w pliku CMakeSettings.

  • W projektach CMake domyślnie jest teraz włączane debugowanie Tylko mój kod.

  • Ostrzeżenia analizy statycznej są teraz przetwarzane w tle i wyświetlane w edytorze dla projektów CMake.

  • Bardziej czytelne komunikaty "begin" i "end" dotyczące kompilacji i konfigurowania dla projektów CMake Visual Studio interfejsu użytkownika postępu kompilacji. Ponadto w obszarze Narzędzia > Options jest teraz dostępne ustawienie poziomu szczegółowości narzędzia CMake, które umożliwia dostosowanie poziomu szczegółowości komunikatów konfiguracyjnych i kompilacji narzędzia CMake w Okno Dane wyjściowe.

  • Ustawienie jest teraz obsługiwane w programie CMakeSettings.jsw celu określenia toolchains bez ręcznego modyfikowania wiersza polecenia cmakeToolchain narzędzia CMake.

  • Nowy skrót menu Kompilacja wszystkie Ctrl+Shift+B.

Integracja z programem IncrediBuild

Program IncrediBuild jest dołączony jako składnik opcjonalny w przypadku programowania aplikacji klasycznych w języku C++. Monitor kompilacji IncrediBuild jest w pełni zintegrowany z Visual Studio IDE. Aby uzyskać więcej informacji, zobacz Visualize your build with IncrediBuild's Build Monitor and Visual Studio 2019 (Wizualizacja kompilacji za pomocą monitora kompilacji incrediBuild i Visual Studio 2019).

Debugowanie

  • W przypadku aplikacji języka C++ uruchomionych Windows pliki PDB są teraz ładowane w osobnym procesie 64-bitowym. Ta zmiana rozwiązuje szereg awarii spowodowanych przez braku pamięci debugera. Na przykład podczas debugowania aplikacji zawierających dużą liczbę modułów i plików PDB.

  • Wyszukiwanie jest włączone w oknach Czujka, Automatyczne i Ustawienia lokalne.

Windows tworzenia aplikacji klasycznych w języku C++

  • Te kreatory ATL/MFC języka C++ nie są już dostępne:

    • Kreator składników ATL COM+ 1.0
    • Kreator składników stron Active Server ATL
    • Kreator dostawcy interfejsu OLE DB ATL
    • Kreator strony właściwości ATL
    • Kreator konsumenta OLE DB ATL
    • MFC ODBC Consumer
    • MFC, klasa z ActiveX kontroli
    • MFC, klasa z biblioteki typów.

    Przykładowy kod dla tych technologii został zarchiwizowany w witrynie Microsoft Docs i w repozytorium GitHub VCSamples.

  • Zestaw Windows 8.1 Software Development Kit (SDK) nie jest już dostępny w instalatorze Visual Studio oprogramowania. Zalecamy uaktualnienie projektów w języku C++ do najnowszej wersji Windows 10 SDK. Jeśli masz stałą zależność od systemu w wersji 8.1, możesz pobrać go z archiwum zestawu Windows SDK.

  • Obsługa systemu Windows XP nie będzie już dostępna w najnowszym zestawie narzędzi języka C++. Pliki XP przeznaczone dla bibliotek kompilatora MSVC & vs 2017 są nadal obsługiwane i można je instalować za pośrednictwem "poszczególnych składników".

  • Nasza dokumentacja aktywnie zniechęca do użycia modułów scalania w przypadku wdrożenia środowiska uruchomieniowego Visual C++. W tej wersji stanowimy dodatkowy krok oznaczania naszych msm jako przestarzałych. Rozważ migrację wdrożenia centralnego VCRuntime z plików MSM do pakietu redystrybucyjnego.

Opracowywanie aplikacji mobilnych w języku C++ (Android i iOS)

Środowiskiem systemu Android dla języka C++ jest teraz domyślnie zestaw SDK 25 dla systemu Android i zestaw NDK 16b dla systemu Android.

Zestaw narzędzi platformy Clang/C2

Składnik eksperymentalny Clang/C2 został usunięty. Użyj zestawu MSVC, aby uzyskać pełną zgodność ze standardami języka C++ z i , lub zestawu narzędzi /permissive- /std:c++17 Clang/LLVM dla Windows.

Analiza kodu

Testowanie jednostek

Szablon zarządzanego projektu testowego w języku C++ nie jest już dostępny. Możesz nadal używać zarządzanej struktury testów języka C++ w istniejących projektach. W przypadku nowych testów jednostkowych rozważ użycie jednej z natywnych platform testów, dla których usługa Visual Studio udostępnia szablony (MSTest, Google Test) lub zarządzanego szablonu testowego języka C# Project testowego.