Delen via


Hintbestanden

Een hintbestand bevat macro's die anders ertoe zouden leiden dat regio's met code worden overgeslagen door de C++-navigatiedatabaseparser. Wanneer u een Visual Studio C++-project opent, analyseert de parser de code in elk bronbestand in het project en bouwt een database met informatie over elke id. De IDE gebruikt deze informatie ter ondersteuning van functies voor code browsen, zoals de browser Class View en de navigatiebalk.

De parser van de C++-browsedatabase is een fuzzy parser waarmee grote hoeveelheden code in korte tijd kunnen worden geparseerd. Een reden waarom het snel is, is omdat de inhoud van blokken wordt overgeslagen. Het registreert bijvoorbeeld alleen de locatie en parameters van een functie en negeert de inhoud ervan. Bepaalde macro's kunnen problemen veroorzaken voor de heuristiek die wordt gebruikt om het begin en einde van een blok te bepalen. Deze problemen zorgen ervoor dat regio's met code onjuist worden vastgelegd.

Deze overgeslagen regio's kunnen op verschillende manieren worden gemanifesteerd:

  • Ontbrekende typen en functies in klasseweergave, ga naar en navigatiebalk

  • Onjuiste bereiken in de navigatiebalk

  • Suggesties voor het maken van declaratie/definitie voor functies die al zijn gedefinieerd

Een hintbestand bevat door de gebruiker aanpasbare hints, die dezelfde syntaxis hebben als C/C++-macrodefinities. Visual C++ bevat een ingebouwd hintbestand dat voldoende is voor de meeste projecten. U kunt echter uw eigen hintbestanden maken om de parser specifiek voor uw project te verbeteren.

Belangrijk

Als u een hintbestand wijzigt of toevoegt, moet u aanvullende stappen uitvoeren om de wijzigingen van kracht te laten worden:

  • In versies vóór Visual Studio 2017 versie 15.6: Verwijder het .sdf-bestand en/of VC.db bestand in de oplossing voor alle wijzigingen.
  • In Visual Studio 2017 versie 15.6 en hoger: Sluit de oplossing en open deze opnieuw nadat u nieuwe hintbestanden hebt toegevoegd.

Scenariobeschrijving

#define NOEXCEPT noexcept
void Function() NOEXCEPT
{
}

Zonder een hintbestand wordt Function deze niet weergegeven in de klasweergave, ga naar of de navigatiebalk. Nadat u een hintbestand met deze macrodefinitie hebt toegevoegd, begrijpt en vervangt de parser de NOEXCEPT macro, zodat deze de functie correct kan parseren:

#define NOEXCEPT

Storende macro's

Er zijn twee categorieën macro's die de parser verstoren:

  • Macro's die trefwoorden inkapselen die een functie sieren

    #define NOEXCEPT noexcept
    #define STDMETHODCALLTYPE __stdcall
    

    Voor deze typen macro's is alleen de macronaam vereist in het hintbestand:

    #define NOEXCEPT
    #define STDMETHODCALLTYPE
    
  • Macro's met onevenwichtige vierkante haken

    #define BEGIN {
    

    Voor deze typen macro's zijn zowel de macronaam als de inhoud ervan vereist in het hintbestand:

    #define BEGIN {
    

Ondersteuning voor editor

Vanaf Visual Studio 2017 versie 15.8 zijn er verschillende functies om storende macro's te identificeren:

  • Macro's die zich in regio's bevinden die door de parser worden overgeslagen, worden gemarkeerd.

  • Er is een snelle actie om een hintbestand te maken dat de gemarkeerde macro bevat of als er een bestaand hintbestand is, om de macro toe te voegen aan het hintbestand.

Gemarkeerde macro.

Nadat een van de snelle acties is uitgevoerd, parseert de parser de bestanden die worden beïnvloed door het hintbestand.

De probleemmacro is standaard gemarkeerd als suggestie. De markering kan worden gewijzigd in iets merkbaarser, zoals een rode of groene golvende lijn. Gebruik de optie Macro's in overgeslagen browseregio's in de sectie Code-golvende lijnen onder Extra>Opties>Teksteditor>C/C++>Weergave.

Macro's in optie Overgeslagen browseregio's.

Browsedatabasefouten weergeven

Met de menuopdrachtBladeren door databasefouten in Project> weergeven worden alle regio's weergegeven die niet kunnen worden geparseerd in de lijst met fouten. De opdracht is bedoeld om het bouwen van het eerste hintbestand te stroomlijnen. De parser kan echter niet zien of de oorzaak van de fout een verstorende macro was, dus u moet elke fout evalueren. Voer de opdracht Browsedatabasefouten weergeven uit en navigeer naar elke fout om het betreffende bestand in de editor te laden. Zodra het bestand is geladen, worden ze gemarkeerd als er macro's in de regio staan. U kunt de snelle acties aanroepen om ze toe te voegen aan een hintbestand. Na een update van een hintbestand wordt de foutenlijst automatisch bijgewerkt. Als u het hintbestand handmatig wijzigt, kunt u ook de opdracht Oplossing opnieuw scannen gebruiken om een update te activeren.

Architectuur

Hintbestanden hebben betrekking op fysieke mappen, niet op de logische mappen die worden weergegeven in Solution Explorer. U hoeft geen hintbestand aan uw project toe te voegen, zodat het hintbestand een effect heeft. Het parseringssysteem maakt alleen gebruik van hintbestanden wanneer bronbestanden worden geparseerd.

Elk hintbestand heeft de naam cpp.hint. Veel mappen kunnen een hintbestand bevatten, maar slechts één hintbestand kan zich in een bepaalde map voordoen.

Uw project kan worden beïnvloed door nul of meer hintbestanden. Als er geen hintbestanden zijn, gebruikt het parseringssysteem fouthersteltechnieken om onversleutelbare broncode te negeren. Anders gebruikt het parseringssysteem de volgende strategie om hints te vinden en te verzamelen.

Zoekvolgorde

Het parseringssysteem zoekt in mappen naar hintbestanden in de volgende volgorde.

  • De map met het installatiepakket voor Visual C++ (vcpackages). Deze map bevat een ingebouwd hintbestand dat symbolen in veelgebruikte systeembestanden beschrijft, zoals windows.h. Daarom neemt uw project automatisch de meeste hints over die het nodig heeft.

  • Het pad van de hoofdmap van een bronbestand naar de map die het bronbestand zelf bevat. In een typisch Visual Studio C++-project bevat de hoofdmap de oplossing of het projectbestand.

    De uitzondering op deze regel is als een stopbestand zich in het pad naar het bronbestand bevindt. Een stopbestand is een bestand met de naam cpp.stop. Een stopbestand biedt extra controle over de zoekvolgorde. In plaats van te beginnen vanuit de hoofdmap zoekt het parseringssysteem vanuit de map die het stopbestand bevat naar de map die het bronbestand bevat. In een typisch project hebt u geen stopbestand nodig.

Hint verzamelen

Een hintbestand bevat nul of meer hints. Een hint wordt gedefinieerd of verwijderd, net als een C/C++-macro. Dat wil gezegd, de #define preprocessorrichtlijn creëert of herdefinieert een hint, en de #undef richtlijn verwijdert een hint.

Het parseringssysteem opent elk hintbestand in de eerder beschreven zoekvolgorde. Het verzamelt de hints van elk bestand in een set effectieve hints en gebruikt vervolgens de effectieve hints om de id's in uw code te interpreteren.

Het parseringssysteem gebruikt deze regels om hints te verzamelen:

  • Als de nieuwe hint een naam aangeeft die nog niet is gedefinieerd, voegt de nieuwe hint de naam toe aan de effectieve hints.

  • Als met de nieuwe hint een naam wordt opgegeven die al is gedefinieerd, wordt de bestaande hint opnieuw gedefinieerd.

  • Als de nieuwe hint een #undef richtlijn is waarmee een bestaande effectieve hint wordt opgegeven, wordt de bestaande hint verwijderd.

De eerste regel betekent dat effectieve hints worden overgenomen van eerder geopende hintbestanden. De laatste twee regels betekenen dat hints later in de zoekvolgorde eerdere hints kunnen overschrijven. U kunt bijvoorbeeld eventuele eerdere hints overschrijven als u een hintbestand maakt in de map die een bronbestand bevat.

Zie de sectie Voorbeeld voor een afbeelding van hoe hints worden verzameld.

Syntaxis

U maakt en verwijdert hints met dezelfde syntaxis als de preprocessor-instructies voor het maken en verwijderen van macro's. In feite gebruikt het parseringssysteem de preprocessor C/C++ om de hints te evalueren. Zie #define Directive (C/C++) en #undef Directive (C/C++) voor meer informatie over de preprocessorrichtlijnen.

De enige ongebruikelijke syntaxiselementen zijn de @<, @=en @> vervangende tekenreeksen. Deze hint-bestandspecifieke vervangingstekenreeksen worden alleen gebruikt in kaartmacro's. Een kaart is een set macro's die gegevens, functies of gebeurtenissen relateren aan andere gegevens, functies of gebeurtenis-handlers. MFC gebruikt bijvoorbeeld kaarten om berichtkaarten te maken en ATL maakt gebruik van kaarten om objecttoewijzingen te maken. De hint-bestandspecifieke vervangingstekenreeksen markeren de begin-, tussen- en eindelementen van een kaart. Alleen de naam van een kaartmacro is belangrijk. Daarom verbergt elke vervangende tekenreeks opzettelijk de implementatie van de macro.

Hints gebruiken deze syntaxis:

Syntaxis Betekenis
#define hint-namevervangen-tekenreeks

#define hint-name(parameter, ...)vervangende tekenreeks
Een preprocessorrichtlijn die een nieuwe hint definieert of een bestaande hint opnieuw definieert. Na de instructie vervangt de preprocessor elk exemplaar van hint-naam in de broncode door een vervangende tekenreeks.

Het tweede syntaxisformulier definieert een functieachtige hint. Als een functie-achtige hint voorkomt in de broncode, vervangt de preprocessor eerst elk exemplaar van de parameter in de vervangende tekenreeks door het bijbehorende argument in de broncode en vervangt vervolgens hint-naam door vervangende tekenreeks.
@< Een hint-file-specifieke vervangingsreeks die het begin aangeeft van een set kaartelementen.
@= Een hint-file-specifieke vervangingsreeks die een tussenliggend kaartelement aangeeft. Een kaart kan meerdere kaartelementen bevatten.
@> Een hint-bestand dat specifiek is voor vervangingstekenreeksen die het einde van een set kaartelementen aangeeft.
#undef hint-name De preprocessorrichtlijn waarmee een bestaande hint wordt verwijderd. De naam van de hint wordt opgegeven door de hint-naam-id .
// opmerking Een opmerking met één regel.
/* commentaar*/ Een opmerking met meerdere regels.

Voorbeeld

In dit voorbeeld ziet u hoe hints worden verzameld uit hintbestanden. Stopbestanden worden niet gebruikt in dit voorbeeld.

In de afbeelding ziet u enkele fysieke mappen in een Visual Studio C++-project. Er zijn hintbestanden in de vcpackagesmappen , Debugen A1A2 mappen.

Hint File Directory's

Diagram met de algemene en projectspecifieke hintbestandsmappen.

Inhoud van mappen en hintbestanden

Deze lijst bevat de mappen in dit project met hintbestanden en de inhoud van deze hintbestanden. Er worden slechts enkele van de vele hints in het vcpackages maphintbestand weergegeven:

  • vcpackages

    // vcpackages (partial list)
    #define _In_
    #define _In_opt_
    #define _In_z_
    #define _In_opt_z_
    #define _In_count_(size)
    
  • Fouten opsporen

    // 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
    

Effectieve hints

Deze tabel bevat de effectieve hints voor de bronbestanden in dit project:

  • Bronbestand: A1_A2_B.cpp

  • Effectieve hints:

    // 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 }
    

Deze notities zijn van toepassing op de voorgaande lijst:

  • De effectieve hints zijn afkomstig uit de vcpackagesmappen , Debugen A2A1mappen.

  • De #undef instructie in het Debug hintbestand heeft de #define _In_ hint verwijderd in het vcpackages maphintbestand.

  • Het hintbestand in de A1 map wordt opnieuw gedefinieerd START_NAMESPACE.

  • De #undef hint in de A2 map heeft de hints verwijderd voor OBRACE en CBRACE in het Debug maphintbestand.

Zie ook

Bestandstypen gemaakt voor Visual Studio C++-projecten
#define Richtlijn (C/C++)
#undef Richtlijn (C/C++)
SAL-aantekeningen