Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En tipsfil innehåller makron som annars skulle leda till att kodområden hoppas över av C++-webbdatabasparsern. När du öppnar ett Visual Studio C++-projekt analyserar parsern koden i varje källfil i projektet och skapar en databas med information om varje identifierare. IDE använder den informationen för att stödja kodbläddringsfunktioner, till exempel webbläsaren Klassvy och navigeringsfältet.
C++-webbdatabasparsern är en fuzzy parser som kan parsa stora mängder kod på kort tid. En anledning till att det går snabbt är att det hoppar över innehållet i block. Den registrerar till exempel bara platsen och parametrarna för en funktion och ignorerar dess innehåll. Vissa makron kan orsaka problem för heuristiken som används för att fastställa början och slutet av ett block. Dessa problem gör att kodregioner registreras felaktigt.
Dessa överhoppade regioner kan visas på flera sätt:
Typer och funktioner som saknas i klassvyn, gå till och navigeringsfältet
Felaktiga omfång i navigeringsfältet
Förslag på att skapa deklaration/definition för funktioner som redan har definierats
En tipsfil innehåller användaranpassade tips som har samma syntax som C/C++-makrodefinitioner. Visual C++ innehåller en inbyggd tipsfil som räcker för de flesta projekt. Du kan dock skapa egna tipsfiler för att förbättra parsern specifikt för projektet.
Viktigt!
Om du ändrar eller lägger till en tipsfil måste du vidta ytterligare åtgärder för att ändringarna ska börja gälla:
- I versioner före Visual Studio 2017 version 15.6: Ta bort .sdf-filen och/eller VC.db filen i lösningen för alla ändringar.
- I Visual Studio 2017 version 15.6 och senare: Stäng och öppna lösningen igen när du har lagt till nya tipsfiler.
Scenarium
#define NOEXCEPT noexcept
void Function() NOEXCEPT
{
}
Utan en tipsfil Function visas inte i klassvyn, gå till eller navigeringsfältet. När du har lagt till en tipsfil med den här makrodefinitionen förstår och ersätter parsern NOEXCEPT nu makrot, vilket gör att det kan parsa funktionen korrekt:
#define NOEXCEPT
Störande makron
Det finns två kategorier av makron som stör parsern:
Makron som kapslar in nyckelord som pryder en funktion
#define NOEXCEPT noexcept #define STDMETHODCALLTYPE __stdcallFör dessa typer av makron krävs endast makronamnet i tipsfilen:
#define NOEXCEPT #define STDMETHODCALLTYPEMakron som innehåller obalanserade hakparenteser
#define BEGIN {För dessa typer av makron krävs både makronamnet och dess innehåll i tipsfilen:
#define BEGIN {
Redigeringsstöd
Från och med Visual Studio 2017 version 15.8 finns det flera funktioner för att identifiera störande makron:
Makron som finns i regioner som hoppas över av parsern är markerade.
Det finns en snabbåtgärd för att skapa en tipsfil som innehåller det markerade makrot, eller om det finns en befintlig tipsfil, för att lägga till makrot i tipsfilen.
När någon av snabbåtgärderna har körts, returnerar parsern de filer som påverkas av tipsfilen.
Som standard är problemmakronet markerat som ett förslag. Markeringen kan ändras till något mer märkbart, till exempel en röd eller grön växling. Använd alternativet Makron i Överhoppade webbläsarregioner i avsnittet Kodsquiggles under Verktyg Alternativ>>Textredigerare>C/C++>View.
Visa webbdatabasfel
Menykommandot Project>Display Browsing Database Errors visar alla regioner som inte kunde parsas i fellistan. Kommandot är avsett att effektivisera skapandet av den första tipsfilen. Parsern kan dock inte avgöra om orsaken till felet var ett störande makro, så du måste utvärdera varje fel. Kör kommandot Visa webbdatabasfel och navigera till varje fel för att läsa in den berörda filen i redigeraren. När filen har lästs in är de markerade om några makron finns i regionen. Du kan anropa snabbåtgärder för att lägga till dem i en tipsfil. Efter en uppdatering av tipsfilen uppdateras fellistan automatiskt. Om du ändrar tipsfilen manuellt kan du också använda kommandot Rescan Solution för att utlösa en uppdatering.
Arkitektur
Tipsfiler är relaterade till fysiska kataloger, inte de logiska kataloger som visas i Solution Explorer. Du behöver inte lägga till en tipsfil i projektet för att tipsfilen ska ha en effekt. Parsningssystemet använder bara tipsfiler när källfiler parsas.
Varje tipsfil heter cpp.hint. Många kataloger kan innehålla en ledtrådsfil, men endast en tipsfil kan förekomma i en viss katalog.
Projektet kan påverkas av noll eller fler tipsfiler. Om det inte finns några tipsfiler använder parsningssystemet felåterställningstekniker för att ignorera oläslig källkod. Annars använder parsningssystemet följande strategi för att hitta och samla in tips.
Sökordning
Parsningssystemet söker i kataloger efter tipsfiler i följande ordning.
Katalogen som innehåller installationspaketet för Visual C++ (vcpackages). Den här katalogen innehåller en inbyggd ledtrådsfil som beskriver symboler i systemfiler som används ofta, till exempel windows.h. Därför ärver projektet automatiskt de flesta tips som behövs.
Sökvägen från rotkatalogen för en källfil till den katalog som innehåller själva källfilen. I ett typiskt Visual Studio C++-projekt innehåller rotkatalogen lösningen eller projektfilen.
Undantaget till den här regeln är om en stoppfil finns i sökvägen till källfilen. En stoppfil är en fil med namnet cpp.stop. En stoppfil ger ytterligare kontroll över sökordningen. I stället för att börja från rotkatalogen söker parsningssystemet från katalogen som innehåller stoppfilen till den katalog som innehåller källfilen. I ett typiskt projekt behöver du ingen stoppfil.
Tipsinsamling
En tipsfil innehåller noll eller fler tips. Ett tips definieras eller tas bort precis som ett C/C++-makro. Det innebär att #define förprocessordirektivet skapar eller omdefinierar ett tips, och #undef direktivet tar bort ett tips.
Parsningssystemet öppnar varje tipsfil i sökordningen som beskrevs tidigare. Den ackumulerar varje fils tips i en uppsättning effektiva tips och använder sedan de effektiva tipsen för att tolka identifierarna i koden.
Parsningssystemet använder dessa regler för att samla tips:
Om det nya tipset anger ett namn som inte redan har definierats lägger det nya tipset till namnet i de gällande tipsen.
Om det nya tipset anger ett namn som redan har definierats, omdefinierar det nya tipset det befintliga tipset.
Om det nya tipset är ett
#undefdirektiv som anger ett befintligt effektivt tips tar det nya tipset bort det befintliga tipset.
Den första regeln innebär att effektiva tips ärvs från tidigare öppnade tipsfiler. De två sista reglerna innebär att tips senare i sökordningen kan åsidosätta tidigare tips. Du kan till exempel åsidosätta alla tidigare tips om du skapar en tipsfil i katalogen som innehåller en källfil.
En beskrivning av hur tips samlas in finns i avsnittet Exempel .
Syntax
Du skapar och tar bort tips med samma syntax som förprocessordirektiven för att skapa och ta bort makron. I själva verket använder parsningssystemet C/C++-förprocessorn för att utvärdera tipsen. Mer information om förprocessordirektiven finns i #define direktiv (C/C++) och #undef direktiv (C/C++).
De enda ovanliga syntaxelementen är strängarna @<, @=och @> ersättning. Dessa tipsfilsspecifika ersättningssträngar används endast i kartmakron . En karta är en uppsättning makron som relaterar data, funktioner eller händelser till andra data, funktioner eller händelsehanterare. MFC använder till exempel kartor för att skapa meddelandekartor, och ATL använder kartor för att skapa objektkartor. De antydningsfilspecifika ersättningssträngarna markerar start-, mellan- och slutelementen i en karta. Endast namnet på ett kartmakron är betydande. Därför döljer varje ersättningssträng avsiktligt implementeringen av makrot.
Tips använder den här syntaxen:
| Syntax | Innebörd |
|---|---|
#define
ersättningssträng för hint-name#define
hint-name(parameter, ...)replacement-string |
Ett förprocessordirektiv som definierar ett nytt tips eller omdefinierar ett befintligt tips. Efter direktivet ersätter förprocessorn varje förekomst av hint-name i källkoden med replacement-string. Det andra syntaxformuläret definierar ett funktionsliknande tips. Om ett funktionsliknande tips inträffar i källkoden ersätter förprocessorn först varje förekomst av parametern i ersättningssträngen med motsvarande argument i källkoden och ersätter sedan hint-name med replacement-string. |
@< |
En hint-file-specifik ersättningssträng som anger början på en uppsättning kartelement. |
@= |
En hint-file-specifik ersättningssträng som anger ett mellanliggande kartelement. En karta kan ha flera kartelement. |
@> |
En hint-file-specifik ersättningssträng som anger slutet på en uppsättning kartelement. |
#undef
hint-name |
Det förprocessordirektiv som tar bort ett befintligt tips. Namnet på tipset tillhandahålls av hint-name-identifieraren . |
//
kommentar |
En kommentar med en rad. |
/*
kommentar*/ |
En flerradskommentare. |
Exempel
Det här exemplet visar hur tips ackumuleras från tipsfiler. Stoppfiler används inte i det här exemplet.
Bilden visar några av de fysiska katalogerna i ett Visual Studio C++-projekt. Det finns tipsfiler i katalogerna vcpackages, Debug, A1och A2 .
Tipsfilkataloger
Kataloger och tipsfilinnehåll
Den här listan visar katalogerna i det här projektet som innehåller tipsfiler och innehållet i dessa tipsfiler. Endast några av de många tipsen vcpackages i katalogtipsfilen visas:
vcpackages
// vcpackages (partial list) #define _In_ #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size)Felsökning
// Debug #undef _In_ #define OBRACE { #define CBRACE } #define RAISE_EXCEPTION(x) throw (x) #define START_NAMESPACE namespace MyProject { #define END_NAMESPACE }A1
// A1 #define START_NAMESPACE namespace A1Namespace {A2
// A2 #undef OBRACE #undef CBRACE
Effektiva tips
I den här tabellen visas de effektiva tipsen för källfilerna i det här projektet:
Källfil: A1_A2_B.cpp
Effektiva tips:
// vcpackages (partial list) #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size) // Debug... #define RAISE_EXCEPTION(x) throw (x) // A1 #define START_NAMESPACE namespace A1Namespace { // ...Debug #define END_NAMESPACE }
Dessa anteckningar gäller för föregående lista:
De effektiva tipsen
vcpackageskommer från katalogerna ,Debug,A1ochA2.#undef-direktivet i
Debugtipsfilen tog bort tipset#define _In_vcpackagesi katalogtipsfilen.Tipsfilen i
A1katalogen omdefinierarSTART_NAMESPACE.Tipset
#undefA2i katalogen tog bort tipsen förOBRACEochCBRACEiDebugkatalogtipsfilen.
Se även
Filtyper som skapats för Visual Studio C++-projekt
#define direktiv (C/C++)
#undef direktiv (C/C++)
SAL-anteckningar