Dela via


Nyheter för C++ i Visual Studio 2017

Visual Studio 2017 innehåller många uppdateringar och korrigeringar i C++-miljön. Vi har åtgärdat över 250 buggar och rapporterat problem i kompilatorn och verktygen. Många skickades av kunder via alternativen Rapportera ett problem och Ange ett förslag under Skicka feedback. Tack för att du rapporterade buggar!

Mer information om nyheter i hela Visual Studio finns i Nyheter i Visual Studio 2017. Information om vad som är nytt för C++ i Visual Studio 2019 finns i Nyheter för C++ i Visual Studio 2019. Information om vad som är nytt för C++ i Visual Studio 2015 och tidigare versioner finns i Visual C++ Nyheter 2003 till och med 2015.

Visual Studio 2017 C++-kompilator

Förbättringar av C++-överensstämmelse

Vi har uppdaterat C++-kompilatorn och standardbiblioteket i den här versionen med förbättrat stöd för C++11- och C++14-funktioner. Den innehåller även preliminärt stöd för vissa funktioner som förväntas vara i C++17-standarden. Detaljerad information finns i Förbättringar av C++-överensstämmelse i Visual Studio 2017.

Visual Studio 2017 version 15.5

Kompilatorn stöder cirka 75% av de funktioner som är nya i C++17, inklusive strukturerade bindningar, constexpr lambdas, if constexpr, infogade variabler, vikuttryck och tillägg noexcept i typsystemet. De här funktionerna är tillgängliga under alternativet /std:c++17 . Mer information finns i Förbättringar av C++-överensstämmelse i Visual Studio 2017

Visual Studio 2017 version 15.7

MSVC-kompilatorverktygen i Visual Studio version 15.7 överensstämmer nu med C++Standard. Mer information finns i Meddelande: MSVC överensstämmer med språkefterlevnad för C++ Standard och Microsoft C/C++.

Visual Studio 2017 version 15.8

Kompilatorväxeln /experimental:preprocessor möjliggör den nya experimentella MSVC-förprocessorn som så småningom följer alla tillämpliga C- och C++-standarder. Mer information finns i Översikt över den nya förprocessorn i MSVC.

Nya kompilatoralternativ

  • /permissive-: Aktivera alla strikta standardefterlevnadskompilatoralternativ och inaktivera de flesta Microsoft-specifika kompilatortillägg (men inte __declspec(dllimport), till exempel). Det här alternativet är aktiverat som standard i Visual Studio 2017 version 15.5. /permissive- Överensstämmelseläget innehåller stöd för tvåfasnamnsökning. Mer information finns i Förbättringar av C++-överensstämmelse i Visual Studio.

  • /diagnostics: Aktiverar visning av diagnostikfelet eller varningsplatsen på tre olika sätt: bara radnumret, radnumret och kolumnen, eller radnumret och kolumnen, med en caret under den felande kodraden.

  • /debug:fastlink: Aktivera upp till 30% snabbare inkrementella länktider (jämfört med Visual Studio 2015) genom att inte kopiera all felsökningsinformation till PDB-filen. PDB-filen pekar i stället på felsökningsinformationen för objektet och biblioteksfilerna som används för att skapa den körbara filen. Se Snabbare C++-byggcykel i VS "15" med /Debug:fastlink och rekommendationer för att påskynda C++-versioner i Visual Studio.

  • Visual Studio 2017 tillåter användning /sdl med /await. Vi har tagit bort begränsningen /RTC med Coroutines.

Visual Studio 2017 version 15.3
  • /std:c++14 och /std:c++latest: Med de här kompilatoralternativen kan du välja specifika versioner av programmeringsspråket ISO C++ i ett projekt. De flesta av de nya standardfunktionerna för utkast skyddas av alternativet /std:c++latest .

  • /std:c++17 aktiverar uppsättningen C++17-funktioner som implementeras av kompilatorn. Det här alternativet inaktiverar kompilator- och standardbiblioteksstöd för funktioner efter C++17: de som ändras eller är nya i senare versioner av arbetsutkastet och defekta uppdateringar av C++ Standard. Om du vill aktivera dessa funktioner använder du /std:c++latest.

Codegen, säkerhet, diagnostik och versionshantering

Den här versionen innehåller flera förbättringar inom optimering, kodgenerering, versionshantering av verktygsuppsättningar och diagnostik. Några viktiga förbättringar är:

  • Förbättrad kodgenerering av loopar: Stöd för automatisk vektorisering av division av konstanta heltal, bättre identifiering av memsetmönster.
  • Förbättrad kodsäkerhet: Förbättrad utsläpp av buffertöverskriden kompilatordiagnostik och /guard:cf skyddar nu switch-instruktioner som genererar hopptabeller.
  • Versionshantering: Värdet för det inbyggda makrot för förprocessorn _MSC_VER uppdateras monotont vid varje uppdatering av Visual C++-verktygsuppsättningen. Mer information finns i Visual C++ Compiler Version.
  • Ny verktygsuppsättningslayout: Kompilatorn och relaterade byggverktyg har en ny plats- och katalogstruktur på utvecklingsdatorn. Den nya layouten möjliggör installationer sida vid sida av flera versioner av kompilatorn. Mer information finns i Layout för kompilatorverktyg i Visual Studio 2017.
  • Förbättrad diagnostik: Utdatafönstret visar nu kolumnen där ett fel inträffar. Mer information finns i Förbättringar av C++-kompilatordiagnostik i VS "15" Förhandsversion 5.
  • När du använde coroutines togs det experimentella nyckelordsutbytet (tillgängligt under alternativet /await ) bort. Koden bör uppdateras så att den används co_yield i stället. Mer information yield finns i nyckelord som ska bli co_yield i VS 2017.
Visual Studio 2017 version 15.3

Förbättringar av diagnostiken i kompilatorn. Mer information finns i Diagnostiska förbättringar i Visual Studio 2017 15.3.0.

Visual Studio 2017 version 15.5

Prestanda för Visual C++-körning fortsätter att förbättras genom bättre genererad kodkvalitet. Nu kan du bara kompilera om koden och appen körs snabbare. Några av kompilatoroptimeringarna är helt nya, till exempel vektorisering av villkorliga skalärlager, kombination av anrop sin(x) och cos(x) till en ny sincos(x)och eliminering av redundanta instruktioner från SSA-optimeraren. Andra kompilatoroptimeringar är förbättringar av befintliga funktioner, till exempel: vektoriserar-heuristik för villkorsuttryck, bättre loopoptimeringar och flyttal min/max-kodgen. Länkaren har en ny och snabbare /OPT:ICF implementering, vilket kan resultera i upp till 9% länktidshastigheter, och det finns andra korrigeringar perf i inkrementell länkning. Mer information finns i /OPT (optimeringar) och /INCREMENTAL (länk stegvis).

Microsoft C++-kompilatorn stöder Intels AVX-512. Den har instruktioner för vektorlängd som ger nya funktioner i AVX-512 till 128-bitars och 256-bitars breda register.

Alternativet /Zc:noexceptTypes- kan användas för att återgå till C++14-versionen av noexcept när du använder C++17-läge i allmänhet. Med det här alternativet kan du uppdatera källkoden så att den överensstämmer med C++17 utan att behöva skriva om all throw() kod samtidigt. Mer information finns i borttagning av dynamisk undantagsspecifikation och noexcept.

Visual Studio 2017 version 15.7

C++-standardbibliotek

Förbättringar av korrekthet

Visual Studio 2017 RTM (version 15.0)
  • Mindre basic_string_ITERATOR_DEBUG_LEVEL != 0 diagnostikförbättringar. När en IDL-kontroll snubblar i strängmaskiner rapporterar den nu det specifika beteende som orsakade resan. I stället för "string iterator not dereferencable" får du till exempel "cannot dereference string iterator because iterator because iterator is out of range (e.g. an end iterator)".
  • Åtgärdade flytttilldelningsoperatorn std::promise , vilket tidigare kunde leda till att koden blockerades för alltid.
  • Korrigerade kompilatorfel med implicit atomic<T*> konvertering till T*.
  • pointer_traits<Ptr> identifierar Ptr::rebind<U>nu korrekt .
  • En kvalificerare som saknas const i move_iterator undertraktionsoperatorn har åtgärdats.
  • Den tysta felaktiga kodgenen har åtgärdats för tillståndskänsliga användardefinierade allokerare som begär propagate_on_container_copy_assignment och propagate_on_container_move_assignment.
  • atomic<T> tolererar nu överlagrade operator&().
  • Något bättre kompilatordiagnostik för felaktiga bind() anrop.

Det finns fler standardbiblioteksförbättringar i Visual Studio 2017 RTM. En fullständig lista finns i C++-teamets bloggpost Standardbibliotekskorrigeringar i VS 2017 RTM.

Visual Studio 2017 version 15.3
  • Standardbibliotekscontainrar klämmer nu fast dem max_size() i stället för numeric_limits<difference_type>::max() i max()size_type. Den här ändringen säkerställer att resultatet av distance() på iteratorer från containern kan representeras i returtypen .distance()
  • Specialiseringen saknades auto_ptr<void>.
  • for_each_n()Algoritmerna , generate_n()och search_n() kunde tidigare inte kompileras om längdargumentet inte var en integrerad typ. De försöker nu konvertera icke-integrala längder till iteratorerna. difference_type
  • normal_distribution<float> avger inte längre varningar i standardbiblioteket om att minska från dubbel till flyttal.
  • basic_string Vissa åtgärder som användes npos i stället för vid kontroll av max_size() maximalt storleksspill har åtgärdats.
  • condition_variable::wait_for(lock, relative_time, predicate) skulle vänta hela den relativa tiden om det fanns en falsk vaka. Nu väntar den bara på ett enda intervall av den relativa tiden.
  • future::get() ogiltigförklarar futurenu , som standard kräver.
  • iterator_traits<void *> brukade vara ett svårt fel eftersom det försökte bilda void&. Nu blir det en tom struct för att tillåta användning av iterator_traits i "is iterator" SFINAE-villkor.
  • Några varningar som rapporterades av Clang -Wsystem-headers var fasta.
  • Också fast "undantagsspecifikation i deklarationen matchar inte tidigare deklaration" som rapporterats av Clang -Wmicrosoft-exception-spec.
  • Också fast mem-initializer-list ordering varningar rapporteras av Clang och C1XX.
  • De osorterade containrarna växlade inte sina hashfunktioner eller predikat när själva containrarna byttes ut. Nu gör de det.
  • Många växlingsåtgärder för containrar är nu markerade noexcept (eftersom vårt standardbibliotek aldrig har för avsikt att utlösa ett undantag vid identifiering av odefinierade beteendevillkor som intepropagate_on_container_swap är lika med allokeraren).
  • Många vector<bool> åtgärder har nu markerats noexcept.
  • Standardbiblioteket tillämpar nu matchande allokerare value_type (i C++17-läge) med en undantagslucka.
  • Vissa villkor där self-range-insert i basic_string skulle förvränga innehållet i strängarna har åtgärdats. (Obs! Självområdesinfogning i vektorer är fortfarande förbjudet enligt standarden.)
  • basic_string::shrink_to_fit() påverkas inte längre av allokerarens propagate_on_container_swap.
  • std::decay hanterar nu avskyvärda funktionstyper, d.v.s. funktionstyper som är cv-kvalificerade, ref-kvalificerade eller båda.
  • Ändrade omfattar direktiv för att använda korrekt skiftlägeskänslighet och snedstreck, vilket förbättrar portabiliteten.
  • Den fasta varningen C4061 "enumerator "enumerator" i växeln för uppräkning hanteras inte uttryckligen av en ärendeetikett. Den här varningen är inaktiverad som standard och har åtgärdats som ett undantag från standardbibliotekets allmänna princip för varningar. (Standardbiblioteket är /W4 rent, men försöker inte vara /Wall rent. Många varningar som inte är standard är ovanligt högljudda och är inte avsedda att användas regelbundet.)
  • Förbättrade std::list felsökningskontroller. Lista iteratorer kontrollerar operator->()nu , och list::unique() markerar nu iteratorer som ogiltiga.
  • Metaprogrammet uses-allocator har åtgärdats i tuple.
Visual Studio 2017 version 15.5
  • std::partition anropar nu predikattiderna N i stället för N + 1 tider, som standard kräver.
  • Försök att undvika magiska statiska objekt i version 15.3 repareras i version 15.5.
  • std::atomic<T> måste T inte längre vara standardkonstruktiv.
  • Heap-algoritmer som tar logaritmisk tid fungerar annorlunda när iteratorfelsökning är aktiverat. De gör inte längre en linjär tids försäkran om att indata i själva verket är en heap.
  • __declspec(allocator) är nu endast skyddad för C1XX, för att förhindra varningar från Clang, som inte förstår denna declspec.
  • basic_string::npos är nu tillgänglig som en kompileringstidskonstant.
  • std::allocator i C++17-läge hanterar nu korrekt allokering av överjusterade typer, det vill ex. typer vars justering är större än max_align_t, såvida inte inaktiverad av /Zc:alignedNew-. Till exempel är vektorer för objekt med justering på 16 byte eller 32 byte nu korrekt justerade för SSE- och AVX-instruktioner.

Anpassningsförbättringar

  • Vi har lagt till <alla>, <string_view>, apply(), make_from_tuple().
  • Valfri,> variant, och cstdalign> har lagts till<.<shared_ptr::weak_type><
  • Aktiverad C++14 constexpr i min(initializer_list), max(initializer_list)och minmax(initializer_list), och min_element(), max_element()och minmax_element().

Mer information finns i Språkefterlevnad för Microsoft C/C++.

Visual Studio 2017 version 15.3
  • Flera andra C++17-funktioner har implementerats. Mer information finns i microsoft C++-språkefterlevnadstabell.
  • Implementerad P0602R0 "variant och valfritt bör sprida copy/move triviality".
  • Standardbiblioteket tolererar nu officiellt att dynamisk RTTI inaktiveras via alternativet /GR- . Både dynamic_pointer_cast() och rethrow_if_nested() kräver dynamic_casti sig , så standardbiblioteket markerar dem nu som =delete under /GR-.
  • Även när dynamisk RTTI inaktiveras via /GR-är "statisk RTTI" i form av typeid(SomeType) fortfarande tillgängligt och driver flera standardbibliotekskomponenter. Standardbiblioteket stöder nu även inaktivering av den här funktionen via /D_HAS_STATIC_RTTI=0. Den här flaggan inaktiverar std::anyockså medlemsfunktionerna target()std::functionoch target_type() och get_deleter() funktionen std::shared_ptr vänmedlem för och std::weak_ptr.
  • Standardbiblioteket använder nu C++14 constexpr villkorslöst i stället för villkorsdefinierade makron.
  • Standardbiblioteket använder nu aliasmallar internt.
  • Standardbiblioteket använder nullptr nu internt i stället för nullptr_t{}. (Intern användning av NULL har utrotats. Intern användning av 0 som null rensas gradvis.)
  • Standardbiblioteket använder std::move() nu internt i stället för att stilistiskt missbruka std::forward().
  • Har ändrats static_assert(false, "message") till #error message. Den här ändringen förbättrar kompilatordiagnostiken eftersom #error kompilering omedelbart stoppas.
  • Standardbiblioteket markerar inte längre funktioner som __declspec(dllimport). Modern länkteknik kräver det inte längre.
  • Extraherade SFINAE till standardmallargument, vilket minskade oredan jämfört med returtyper och funktionsargumenttyper.
  • Felsöka kontroller slumpmässigt <> använder nu standardbibliotekets vanliga maskiner, i stället för den interna funktionen _Rng_abort(), som anropade fputs() till stderr. Implementeringen av den här funktionen behålls för binär kompatibilitet. Vi tar bort den i nästa binär-inkompatibla version av standardbiblioteket.
Visual Studio 2017 version 15.5
  • Flera standardbiblioteksfunktioner har lagts till, föråldrats eller tagits bort enligt C++17-standarden. Mer information finns i Förbättringar av C++-överensstämmelse i Visual Studio.
  • Experimentellt stöd för följande parallella algoritmer:
    • all_of
    • any_of
    • for_each
    • for_each_n
    • none_of
    • reduce
    • replace
    • replace_if
    • sort
  • Signaturerna för följande parallella algoritmer läggs till men parallelliseras inte just nu. Profilering visade ingen fördel med parallellisering av algoritmer som bara flyttar eller permuterar element:
    • copy
    • copy_n
    • fill
    • fill_n
    • move
    • reverse
    • reverse_copy
    • rotate
    • rotate_copy
    • swap_ranges
Visual Studio 2017 version 15.6
  • <memory_resource>
  • Biblioteksgrunder V1
  • Ta polymorphic_allocator bort tilldelning
  • Förbättra argumentavdraget för klassmallar
Visual Studio 2017 version 15.7
  • Stöd för parallella algoritmer är inte längre experimentellt
  • En ny implementering av <filesystem>
  • Elementära strängkonverteringar (partiella)
  • std::launder()
  • std::byte
  • hypot(x,y,z)
  • Undvika onödigt förfall
  • Matematiska specialfunktioner
  • constexpr char_traits
  • Avdragsguider för standardbiblioteket

Mer information finns i Språkefterlevnad för Microsoft C/C++.

Prestanda- och dataflödeskorrigeringar

  • Överlagringar basic_string::find(char) anropade traits::find bara en gång. Tidigare implementerades den som en allmän strängsökning efter en sträng med längd 1.
  • basic_string::operator== kontrollerar nu strängens storlek innan du jämför strängarnas innehåll.
  • Tog bort kontrollkopplingen i basic_string, vilket var svårt för kompilatoroptimeraren att analysera. För alla korta strängar har anrop reserve fortfarande en icke-nollkostnad för att inte göra någonting.
  • std::vector har setts över för korrekthet och prestanda: alias under infognings- och emplace-åtgärder hanteras nu korrekt enligt standard, den starka undantagsgarantin tillhandahålls nu när standard via move_if_noexcept() och annan logik krävs, och infoga och förplacerar färre elementåtgärder.
  • C++-standardbiblioteket undviker nu att avreferera null fancy-pekare.
  • Förbättrad weak_ptr::lock() prestanda.
  • För att öka kompilatorns dataflöde undviker C++ standardbibliotekshuvuden nu att inkludera deklarationer för onödiga inbyggda kompilatorer.
  • Förbättrade prestanda std::string för och std::wstring flytta konstruktorer med mer än tre gånger.
Visual Studio 2017 version 15.3
  • Arbetade med interaktioner med noexcept, vilket förhindrade inlining av std::atomic implementeringen i funktioner som använder SEH (Structured Exception Handling).
  • Standardbibliotekets interna _Deallocate() funktion har ändrats så att den optimeras till mindre kod, så att den kan infogas på fler platser.
  • Har ändrats std::try_lock() för att använda packexpansion i stället för rekursion.
  • Förbättrade algoritmen std::lock() för undvikande av dödläge för att använda lock() åtgärder i stället för att snurra på try_lock() alla lås.
  • Aktiverade optimering av namngivet returvärde i system_category::message().
  • conjunction och disjunction instansiera N + 1 typer i stället för 2N + 2 typer.
  • std::function instansierar inte längre allokerarens stödmaskiner för varje typraderad anropsbar, förbättrar dataflödet och minskar .obj storlek i program som skickar många distinkta lambdas till std::function.
  • allocator_traits<std::allocator> innehåller manuellt infogade std::allocator åtgärder, vilket minskar kodstorleken i kod som endast interagerar med std::allocator via allocator_traits (det vill: i de flesta kod).
  • Det minimala allokeringsgränssnittet C++11 hanteras nu av standardbiblioteksanropet allocator_traits direkt, i stället för att omsluta allokeraren i en intern klass _Wrap_alloc. Den här ändringen minskar den kodstorlek som genereras för allokeringsstöd, förbättrar optimerarens möjlighet att resonera om standardbibliotekscontainrar i vissa fall och ger en bättre felsökningsupplevelse (som nu ser du allokeringstypen i stället _Wrap_alloc<your_allocator_type> för i felsökningsprogrammet).
  • Tog bort metaprogrammering för anpassade allocator::reference, som allokerare inte får anpassa. (Allokerare kan göra containrar använda fancy pekare men inte fancy referenser.)
  • Kompilatorns klientdel lärdes att packa upp felsöknings iteratorer i intervallbaserade för loopar, vilket förbättrar prestandan för felsökningsversioner.
  • Den basic_string interna krympningssökvägen för shrink_to_fit() och reserve() är inte längre i sökvägen för att omplacera åtgärder, vilket minskar kodstorleken för alla muterande medlemmar.
  • Den basic_string interna tillväxtsökvägen finns inte längre i sökvägen shrink_to_fit()till .
  • De basic_string muterande åtgärderna räknas nu in i icke-allokering av snabb sökväg och allokering av funktioner för långsam sökväg, vilket gör det mer sannolikt att det vanliga fallet utan omallokering infogas i anropare.
  • De basic_string muterande åtgärderna konstruerar nu omallokerade buffertar i önskat tillstånd i stället för att ändra storlek på plats. En infogning i början av en sträng flyttar nu innehållet efter infogningen exakt en gång. Den har flyttats ned eller till den nyligen allokerade bufferten. Den flyttas inte längre två gånger i omlokaliseringsfallet, först till den nyligen allokerade bufferten och sedan nedåt.
  • Åtgärder som anropar C-standardbiblioteket i <strängen>errno cachelagr nu adressen för att ta bort upprepad interaktion med TLS.
  • Förenklade implementeringen is_pointer .
  • Har ändrat funktionsbaserat uttryck SFINAE till struct och void_t-baserat.
  • Standardbiblioteksalgoritmer undviker nu postincrementing-iteratorer.
  • Varningar om trunkering har åtgärdats vid användning av 32-bitars allokerare i 64-bitarssystem.
  • std::vector flytta tilldelningen är nu effektivare i fallet med icke-POCMA-icke-equal-allocator genom att återanvända bufferten när det är möjligt.
Visual Studio 2017 version 15.5
  • basic_string<char16_t> engagerar nu samma memcmp, memcpyoch liknande optimeringar som basic_string<wchar_t> engagerar.
  • En begränsning för optimeraren som förhindrade funktionspekare från att infogas, som exponerades av vårt arbete med att "undvika kopieringsfunktioner" i Visual Studio 2015 Update 3, har bearbetats och återställt prestanda lower_bound(iter, iter, function pointer)för .
  • Omkostnaderna för iteratorfelsökningens orderverifiering av indata till includes, set_difference, set_symmetric_differenceoch set_union minskades genom att iteratorer togs bort innan beställningen kontrollerades.
  • std::inplace_merge hoppar nu över element som redan är på plats.
  • Konstruktionen std::random_device konstruerar inte längre och förstör sedan en std::string.
  • std::equal och std::partition hade ett hopptrådsoptimeringspass som sparar en iteratorjämförelse.
  • När std::reverse skickas pekare till trivialt kopierbar T, skickas den nu till en handskriven vektoriserad implementering.
  • std::fill, std::equaloch std::lexicographical_compare fick lära sig att skicka till memset och memcmp för std::byte och gsl::byte (och andra teckenliknande uppräkningar och uppräkningsklasser). Eftersom std::copy sändningar med hjälp av is_trivially_copyablebehövdes inga ändringar.
  • Standardbiblioteket innehåller inte längre destruktorer med tomma klammerparenteser vars enda beteende var att göra typerna icke-trivialt förstörbara.

Andra bibliotek

Stöd för bibliotek med öppen källkod

Vcpkg är ett kommandoradsverktyg med öppen källkod som avsevärt förenklar processen med att hämta och skapa C++-statiska libs med öppen källkod och DLLS i Visual Studio. Mer information finns i vcpkg.

CPPRest SDK 2.9.0

Visual Studio 2017 version 15.5

CPPRestSDK, ett plattformsoberoende webb-API för C++, uppdateras till version 2.9.0. Mer information finns i CppRestSDK 2.9.0 är tillgängligt på GitHub.

ATL

Visual Studio 2017 version 15.5
  • Ännu en uppsättning korrigeringar för namnuppslagskonformhet
  • Befintliga flyttkonstruktorer och flytttilldelningsoperatorer är nu korrekt markerade som icke-inläsande
  • Oövertrycka giltig varning C4640 om trådsäker init för lokal statisk i atlstr.h
  • Trådsäker initiering av lokala statiska objekt inaktiverades automatiskt i XP-verktygsuppsättningen när du använde ATL för att skapa en DLL. Nu är det inte det. Du kan lägga till /Zc:threadSafeInit- dina Projektinställningar om du inte vill ha en trådsäker initiering.

Visual C++ runtime

  • Nytt huvud "cfguard.h" för Control Flow Guard-symboler.

Visual Studio 2017 C++ IDE

  • Konfigurationsändringsprestanda är nu bättre för C++-interna projekt och mycket bättre för C++/CLI-projekt. När en lösningskonfiguration aktiveras för första gången går det snabbare och alla senare aktiveringar av den här lösningskonfigurationen är nästan omedelbar.
Visual Studio 2017 version 15.3
  • Flera projekt- och kodguider har skrivits om i dialogrutan signatur.
  • Lägg till klass startar nu guiden Lägg till klass direkt. Alla andra objekt som tidigare fanns här är nu tillgängliga under Lägg till > nytt objekt.
  • Win32-projekt finns nu under kategorin Windows Desktop i dialogrutan Nytt projekt .
  • Mallarna för Windows-konsolen och skrivbordsprogrammet skapar nu projekten utan att visa en guide. Det finns en ny Windows Desktop-guide under samma kategori som visar samma alternativ som den gamla guiden för Win32-konsolprogram .
Visual Studio 2017 version 15.5

Flera C++-åtgärder som använder IntelliSense-motorn för refaktorisering och kodnavigering körs mycket snabbare. Följande siffror baseras på Visual Studio Chromium-lösningen med 3 500 projekt:

Feature Prestandaförbättring
Rename 5,3 x
Ändra signatur 4,5 x
Hitta alla referenser 4,7 x

C++ stöder nu Ctrl+Klicka på Gå till definition, vilket gör det enkelt att navigera med musen till definitioner. Structure Visualizer från Productivity Power Tools-paketet ingår nu också i produkten som standard.

IntelliSense

  • Den nya SQLite-baserade databasmotorn används nu som standard. Den nya motorn påskyndar databasåtgärder som Go To Definition och Find All References. Det förbättrar avsevärt den inledande lösningens parsningstid. Inställningen flyttades till Verktyg > Alternativ > Textredigerare > C/C++ > Avancerat. (Det var tidigare under ... C/C++ > Experimentell.)

  • Vi har förbättrat IntelliSense-prestanda för projekt och filer som inte använder förkompilerade rubriker – en automatisk förkompilerad rubrik skapas för rubriker i den aktuella filen.

  • Vi har lagt till felfiltrering och hjälp för IntelliSense-fel i fellistan. Om du klickar på felkolumnen kan du nu filtrera. Om du klickar på de specifika felen eller trycker på F1 startas även en onlinesökning efter felmeddelandet.

    Fellista.

    Fellista filtrerad.

  • Möjligheten att filtrera objekt i medlemslistan har lagts till efter typ.

    Filtrering av medlemslista.

  • Lade till en ny experimentell Prediktiv IntelliSense-funktion som ger sammanhangsberoende filtrering av vad som visas i medlemslistan. Mer information finns i C++ IntelliSense-förbättringar – Förutsägande IntelliSense och filtrering.

  • Hitta alla referenser (Skift+F12) hjälper dig nu att enkelt ta dig runt, även i komplexa kodbaser. Det ger avancerad gruppering, filtrering, sortering, sökning i resultat och (för vissa språk) färgläggning, så att du kan få en tydlig förståelse för dina referenser. För C++innehåller det nya användargränssnittet information om huruvida vi läser från eller skriver till en variabel.

  • Funktionen Dot-to-Arrow IntelliSense har flyttats från experimentell till avancerad och är nu aktiverad som standard. Redigeringsfunktionerna Expandera omfång och Expandera prioritet har flyttats från experimentell till avancerad.

  • De experimentella refaktoriseringsfunktionerna Ändra signatur och Extrahera funktion är nu tillgängliga som standard.

  • En experimentell funktion för "Snabbare projektbelastning" har lagts till för C++-projekt. Nästa gång du öppnar ett C++-projekt läses det in snabbare och tiden efter det läses det in mycket snabbare!

  • Vissa av dessa funktioner är gemensamma för andra språk, och vissa är specifika för C++. Mer information om dessa nya funktioner finns i Tillkännagivande av Visual Studio "15" Förhandsversion 5.

Visual Studio 2017 version 15.7

Icke-MSBuild-projekt med öppen mapp

Visual Studio 2017 introducerar funktionen Öppna mapp . Det gör att du kan koda, skapa och felsöka i en mapp som innehåller källkod utan att behöva skapa några lösningar eller projekt. Nu är det enklare att komma igång med Visual Studio, även om projektet inte är ett MSBuild-baserat projekt. Öppna mapp ger dig åtkomst till kraftfulla funktioner för kodtolkning, redigering, skapande och felsökning. De är samma som Visual Studio redan tillhandahåller för MSBuild-projekt. Mer information finns i Öppna mappprojekt för C++.

  • Förbättringar av open folder-upplevelsen. Du kan anpassa upplevelsen via dessa .json filer:
    • CppProperties.json för att anpassa IntelliSense- och surfupplevelsen.
    • Tasks.json för att anpassa byggstegen.
    • Launch.json för att anpassa felsökningsfunktionen.
Visual Studio 2017 version 15.3
  • Förbättrat stöd för alternativa kompilatorer och byggmiljöer som MinGW och Cygwin. Mer information finns i Använda MinGW och Cygwin med Visual C++ och Öppna mapp.
  • Stöd har lagts till för att definiera globala och konfigurationsspecifika miljövariabler i CppProperties.json och CMakeSettings.json. Dessa miljövariabler kan användas genom felsökningskonfigurationer som definierats i launch.vs.json och uppgifter i tasks.vs.json. Mer information finns i Anpassa din miljö med Visual C++ och Öppna mapp.
  • Förbättrat stöd för CMake ninja generator, inklusive möjligheten att enkelt rikta 64-bitars plattformar.

CMake-stöd via öppen mapp

Visual Studio 2017 introducerar stöd för att använda CMake-projekt utan att konvertera till MSBuild-projektfiler (.vcxproj). Mer information finns i CMake-projekt i Visual Studio. Om du öppnar CMake-projekt med Öppen mapp konfigureras miljön automatiskt för C++-redigering, skapande och felsökning.

  • C++ IntelliSense fungerar utan att du behöver skapa en CppProperties.json fil i rotmappen. Vi har lagt till en ny listruta så att användarna enkelt kan växla mellan konfigurationer som tillhandahålls av CMake och CppProperties.json filer.

  • Ytterligare konfiguration stöds via en CMakeSettings.json fil som finns i samma mapp som den CMakeLists.txt filen.

    CMake Öppna mapp.

Visual Studio 2017 version 15.3
  • Stöd har lagts till för CMake Ninja-generatorn.
Visual Studio 2017 version 15.4
  • Stöd har lagts till för att importera befintliga CMake-cacheminnen.
Visual Studio 2017 version 15.5

Utveckling av Windows-skrivbord

Vi tillhandahåller nu en mer detaljerad installationsupplevelse för att installera den ursprungliga C++-arbetsbelastningen. Vi har lagt till valbara komponenter som gör att du kan installera bara de verktyg som du behöver. De angivna installationsstorlekarna för de komponenter som anges i installationsgränssnittet är felaktiga och underskattar den totala storleken.

Om du vill skapa Win32-projekt i C++-skrivbordsarbetsbelastningen måste du installera både en verktygsuppsättning och en Windows SDK. Installera de rekommenderade (valda) komponenterna VC++ 2017 v141-verktygsuppsättningen (x86, x64) och Windows 10 SDK (10.0.nnnnnn) för att se till att det fungerar. Om de nödvändiga verktygen inte har installerats skapas inte projekt och guiden slutar svara.

Visual Studio 2017 version 15.5

Visual C++ Build-verktygen (tidigare tillgängliga som en fristående produkt) ingår nu som en arbetsbelastning i Visual Studio Installer. Den här arbetsbelastningen installerar endast de verktyg som krävs för att skapa C++-projekt utan att installera Visual Studio IDE. Både verktygsuppsättningarna v140 och v141 ingår. Verktygsuppsättningen v141 innehåller de senaste förbättringarna i Visual Studio 2017 version 15.5. Mer information finns i Visual Studio Build Tools now include the VS2017 and VS2015 MSVC Toolsets (Verktyg för VS2017 och VS2015 MSVC).

Linux-utveckling med C++

Det populära tillägget Visual C++ för Linux Development är nu en del av Visual Studio. Den här installationen innehåller allt du behöver för att utveckla och felsöka C++-program som körs i en Linux-miljö.

Visual Studio 2017 version 15.2

Förbättringar har gjorts i plattformsoberoende koddelning och typvisualisering. Mer information finns i Förbättringar av Linux C++ för plattformsoberoende koddelning och typvisualisering.

Visual Studio 2017 version 15.5
  • Linux-arbetsbelastningen har lagt till stöd för rsync som ett alternativ till sftp för synkronisering av filer till fjärranslutna Linux-datorer.
  • Stöd läggs till för korskompilering som riktar sig till ARM-mikrostyrenheter. Om du vill aktivera den i installationen väljer du Linux-utveckling med C++ -arbetsbelastning och väljer alternativet för Inbäddad och IoT-utveckling. Det här alternativet lägger till ARM GCC-verktygen för korskompilering och Gör i installationen. Mer information finns i ARM GCC Cross Compilation i Visual Studio.
  • Stöd har lagts till för CMake. Nu kan du arbeta med din befintliga CMake-kodbas utan att behöva konvertera den till ett Visual Studio-projekt. Mer information finns i Konfigurera ett Linux CMake-projekt.
  • Stöd har lagts till för att köra fjärruppgifter. Med den här funktionen kan du köra alla kommandon på ett fjärrsystem som definieras i Anslutningshanteraren i Visual Studio. Fjärruppgifter ger också möjlighet att kopiera filer till fjärrsystemet. Mer information finns i Konfigurera ett Linux CMake-projekt.
Visual Studio 2017 version 15.7

Spelutveckling med C++

Använd den fulla kraften i C++ för att skapa professionella spel som drivs av DirectX eller Cocos2d.

Mobil utveckling med C++ för Android och iOS

Nu kan du skapa och felsöka mobilappar med hjälp av Visual Studio som kan rikta in sig på Android och iOS.

Universella Windows-appar

C++ är en valfri komponent för arbetsbelastningen Universell Windows-app. För närvarande måste du uppgradera C++-projekt manuellt. Du kan öppna ett v140-målbaserat Universal Windows Platform-projekt i Visual Studio 2017. Du måste dock välja verktygsuppsättningen för v141-plattformen på projektegenskapssidorna om du inte har Visual Studio 2015 installerat.

Nya alternativ för C++ på Universal Windows Platform (UWP)

Nu har du nya alternativ för att skriva och paketera C++-program för den universella Windows-plattformen och Windows Store: Med skrivbordsbrygginfrastrukturen kan du paketera ditt befintliga skrivbordsprogram eller COM-objekt för distribution via Windows Store. Eller för distribution via dina befintliga kanaler via sidoinläsning. Med nya funktioner i Windows 10 kan du lägga till UWP-funktioner i ditt skrivbordsprogram på olika sätt. Mer information finns i Desktop Bridge.

Visual Studio 2017 version 15.5

En projektmall för Windows Application Packaging Project läggs till, vilket avsevärt förenklar paketeringen av skrivbordsprogram med Desktop Bridge. Den är tillgänglig under Arkiv | Ny | Projekt | Installerat | Visual C++ | Universell Windows-plattform. Mer information finns i Paketera en app med hjälp av Visual Studio (Desktop Bridge).

När du skriver ny kod kan du nu använda C++/WinRT, en C++-standardspråkprojektion för Windows Runtime som endast implementeras i huvudfiler. Det gör att du kan använda och skapa Windows Runtime-API:er med hjälp av alla standardkonforma C++-kompilatorer. C++/WinRT är utformat för att ge C++-utvecklare förstklassig åtkomst till det moderna Windows-API:et. Mer information finns i C++/WinRT.

Från och med version 17025 av Windows SDK Insider Preview ingår C++/WinRT i Windows SDK. Mer information finns i C++/WinRT ingår nu i Windows SDK.

Plattformsverktygsuppsättningen Clang/C2

Verktygsuppsättningen Clang/C2 som levereras med Visual Studio 2017 stöder nu växeln /bigobj , vilket är avgörande för att skapa stora projekt. Den innehåller också flera viktiga felkorrigeringar, både i kompilatorns klientdel och serverdel.

C++-kodanalys

C++ Core Checkers för att framtvinga C++ Core-riktlinjerna distribueras nu med Visual Studio. Aktivera kryssarna på sidan Kodanalystillägg på projektets egenskapssidor. Tilläggen inkluderas sedan när du kör kodanalys. Mer information finns i Använda C++ Core Guidelines-kontroller.

Skärmbild av dialogrutan Egenskapssidor som visar konfigurationsegenskaper > Kodanalys > Allmänt valt och ett antal kärnkontroller som anges i avsnittet Kör den här regeluppsättningen.

Visual Studio 2017 version 15.3
  • Stöd har lagts till för regler som rör resurshantering.
Visual Studio 2017 version 15.5
  • Nya C++ Core Guidelines-kontroller omfattar smart pekare korrekthet, korrekt användning av globala initierare och flaggning av användning av konstruktioner som goto och dåliga casts.

  • Vissa varningsnummer som du kanske hittar i 15.3 är inte längre tillgängliga i 15.5. Dessa varningar ersattes med mer specifika kontroller.

Visual Studio 2017 version 15.6
Visual Studio 2017 version 15.7

Enhetstestning i Visual Studio 2017

Visual Studio 2017 version 15.5

Google Test Adapter och Boost.Test Adapter är nu tillgängliga som komponenter i skrivbordsutvecklingen med C++ -arbetsbelastning. De är integrerade med Test Explorer. CTest-stöd läggs till för CMake-projekt (med öppen mapp), även om fullständig integrering med Test Explorer inte är tillgänglig ännu. Mer information finns i Skriva enhetstester för C/C++.

Visual Studio 2017 version 15.6
  • Stöd har lagts till för stöd för Boost.Test dynamiskt bibliotek.
  • En Boost.Test objektmall är nu tillgänglig i IDE.

Mer information finns i Boost.Test Enhetstestning: Stöd för dynamiskt bibliotek och Mall för nytt objekt.

Visual Studio 2017 version 15.7

CodeLens-stöd har lagts till för C++-enhetstestprojekt. Mer information finns i Meddelande om CodeLens för C++-enhetstestning.

Visual Studio-grafikdiagnostik

Visual Studio-verktyg för grafikdiagnostik: Du kan använda dem för att registrera och analysera renderings- och prestandaproblem i Direct3D-appar. Använd dem i appar som körs lokalt på din Windows-dator, i en Windows-enhetsemulator eller på en fjärrdator eller enhet.

  • Indata och utdata för hörn- och geometriskuggningar: Möjligheten att visa indata och utdata från hörnskuggor och geometriskuggningar har varit en av de mest efterfrågade funktionerna. Det stöds nu i verktygen. Välj VS- eller GS-fasen i vyn Pipelinefaser för att börja inspektera indata och utdata i tabellen nedan.

    Indata/utdata för skuggningar.

  • Sök och filtrera i objekttabellen: Ger ett snabbt och enkelt sätt att hitta de resurser du letar efter.

    Skärmbild av avsnittet Objekttabell med listrutan Typ och textrutan Sök markerad.

  • Resurshistorik: Den här nya vyn ger ett effektivt sätt att se hela ändringshistoriken för en resurs som den användes under återgivningen av en infångad ram. Om du vill anropa historiken för en resurs klickar du på klockikonen bredvid valfri resurslänk.

    Resurshistorik.

    Det visar det nya resurshistorikverktygets fönster, fyllt med resursens ändringshistorik.

    Ändring av resurshistorik.

    Du kan avbilda bildrutor med full anropsstacken aktiverad. Det gör att du snabbt kan härleda kontexten för varje ändringshändelse och inspektera den i ditt Visual Studio-projekt. Ange alternativet för fullständig stackinsamling i dialogrutan Alternativ för Visual Studio-verktyg > under Grafikdiagnostik.

  • API-statistik: Visa en översikt över API-användning i din ram. Det är praktiskt att upptäcka samtal som du kanske inte inser att du gör alls, eller samtal som du gör för ofta. Det här fönstret är tillgängligt via Visa > API-statistik i Visual Studio Graphics Analyzer.

    API-statistik.

  • Minnesstatistik: Visa hur mycket minne drivrutinen allokerar för de resurser som du skapar i ramen. Det här fönstret är tillgängligt via Visa > minnesstatistik i Visual Studio Graphics Analyzer. Om du vill kopiera data till en CSV-fil för visning i ett kalkylblad högerklickar du och väljer Kopiera alla.

    Minnesstatistik.

  • Bildrutevalidering: Den nya listan med fel och varningar är ett enkelt sätt att navigera i händelselistan baserat på potentiella problem som identifierats av Direct3D-felsökningsskiktet. Klicka på Visa > ramverifiering i Visual Studio Graphics Analyzer för att öppna fönstret. Klicka sedan på Kör validering för att starta analysen. Det kan ta flera minuter att slutföra, beroende på ramens komplexitet.

    Ramvalidering.

  • Ramanalys för D3D12: Använd Ramanalys för att analysera anropsprestanda med riktade "what-if"-experiment. Växla till fliken Ramanalys och kör analys för att visa rapporten.

    Ramanalys.

  • Förbättringar av GPU-användning: Öppna spårningar kan tas via Visual Studio GPU Usage Profiler med antingen GPUView eller WPA-verktyget (Windows Performance Analyzer) för mer detaljerad analys. Om du har installerat Windows Performance Toolkit finns det två hyperlänkar: en för WPA och en annan för GPUView längst ned till höger i sessionsöversikten.

    GPU-användning.

    Spårningar som du öppnar i GPUView via den här länken stöder synkroniserad VS- och GPUView-tidslinje zoomning och panorering. En kryssruta i VS styr om synkronisering är aktiverad eller inte.

    GPUView.