Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A tippfájl olyan makrókat tartalmaz, amelyek miatt a C++ böngészési adatbázis-elemző kihagyja a kódterületeket. Amikor megnyit egy Visual Studio C++ projektet, az elemző elemzi a projekt minden forrásfájljában található kódot, és létrehoz egy adatbázist, amely minden azonosítóra vonatkozó információt tartalmaz. Az IDE ezen információk segítségével támogatja a kódböngészési funkciókat, például az Osztálynézet böngészőt és a navigációs sávot.
A C++ böngészési adatbázis-elemző egy homályos elemző, amely rövid idő alatt képes nagy mennyiségű kódot elemezni. A gyors művelet egyik oka, hogy kihagyja a blokkok tartalmát. Például csak egy függvény helyét és paramétereit rögzíti, és figyelmen kívül hagyja annak tartalmát. Bizonyos makrók problémákat okozhatnak a blokkok kezdetének és végének meghatározásához használt heurisztika esetében. Ezek a problémák a kódrégiók helytelen rögzítését okozzák.
Ezek a kihagyott régiók többféleképpen is megjelenhetnek:
Hiányzó típusok és függvények osztálynézetben, ugrás és navigációs sáv
Helytelen hatókörök a navigációs sávon
Javaslatok deklaráció/definíció létrehozásához a már definiált függvényekhez
A tippfájlok felhasználó által testre szabható tippeket tartalmaznak, amelyek szintaxisa megegyezik a C/C++ makródefiníciókkal. A Visual C++ tartalmaz egy beépített tippfájlt, amely a legtöbb projekthez elegendő. Létrehozhat azonban saját emlékeztetőfájlokat is, amelyekkel fejlesztheti az elemzőt kifejezetten a projektjéhez.
Fontos
Ha módosít vagy hozzáad egy tippfájlt, további lépéseket kell tennie a módosítások érvénybe lépéséhez:
- A Visual Studio 2017 15.6-os verziója előtti verziókban: Törölje az .sdf fájlt és/vagy VC.db fájlt a megoldásban az összes módosításhoz.
- A Visual Studio 2017 15.6-os és újabb verzióiban: Új tippfájlok hozzáadása után zárja be és nyissa meg újra a megoldást.
Forgatókönyv
#define NOEXCEPT noexcept
void Function() NOEXCEPT
{
}
Emlékeztetőfájl Function nélkül nem jelenik meg az Osztály nézetben, a Ugrás vagy a navigációs sávon. Miután hozzáadott egy emlékeztetőfájlt ezzel a makródefinícióval, az elemző most már megérti és lecseréli a NOEXCEPT makrót, ami lehetővé teszi a függvény helyes elemzését:
#define NOEXCEPT
Zavaró makrók
A makróknak két kategóriája van, amelyek megzavarják az elemzőt:
Függvényt díszító kulcsszavakat tartalmazó makrók
#define NOEXCEPT noexcept #define STDMETHODCALLTYPE __stdcallAz ilyen típusú makrókhoz csak a makró neve szükséges a tippfájlban:
#define NOEXCEPT #define STDMETHODCALLTYPEKiegyensúlyozatlan szögletes zárójeleket tartalmazó makrók
#define BEGIN {Az ilyen típusú makrókhoz mind a makró neve, mind a tartalma szükséges a tippfájlban:
#define BEGIN {
Szerkesztő támogatása
A Visual Studio 2017 15.8-es verziójától kezdve számos funkcióval azonosíthatja a zavaró makrókat:
Az elemző által kihagyott régiókon belüli makrók ki vannak emelve.
Egy gyorsművelet segítségével létrehozhat egy emlékeztetőfájlt, amely tartalmazza a kiemelt makrót, vagy ha van egy meglévő emlékeztetőfájl, amellyel hozzáadhatja a makrót a emlékeztetőfájlhoz.
A gyorsműveletek bármelyikének végrehajtása után az elemző újra elemzi a tippfájl által érintett fájlokat.
Alapértelmezés szerint a problémamakró javaslatként van kiemelve. A kiemelés módosítható valami észrevehetőbbre, például piros vagy zöld hullámosra. Használja a Makrók lehetőséget a Kihagyott böngészési régiók területen, az Eszközök>beállításai>szövegszerkesztő>C/C++>Nézet alatti Kód hullámosítókszakaszában.
Böngészési adatbázis hibáinak megjelenítése
A Project>Display Browsing Database Errors menü parancs megjeleníti az összes olyan régiót, amely nem elemezhető a hibalistában. A parancs célja a kezdeti emlékeztetőfájl létrehozásának egyszerűsítése. Az elemző azonban nem tudja megállapítani, hogy a hiba oka zavaró makró volt-e, ezért minden hibát ki kell értékelnie. Futtassa a Tallózási adatbázis hibáinak megjelenítése parancsot, és navigáljon az egyes hibákra az érintett fájl szerkesztőbe való betöltéséhez. A fájl betöltése után, ha a makrók a régión belül vannak, ki lesznek emelve. Meghívhatja a gyorsműveleteket, hogy hozzáadja őket egy emlékeztetőfájlhoz. A tippfájl frissítése után a hibalista automatikusan frissül. Ha manuálisan módosítja a tippfájlt, a Rescan Solution paranccsal aktiválhat egy frissítést.
Építészet
A tippfájlok fizikai könyvtárakhoz kapcsolódnak, nem a Megoldáskezelőben látható logikai könyvtárakhoz. Nem kell emlékeztetőfájlt hozzáadnia a projekthez ahhoz, hogy a emlékeztetőfájl hatása érvényesüljön. Az elemzési rendszer csak akkor használ tippfájlokat, ha a forrásfájlokat elemzi.
Minden tippfájl neve cpp.hint. Sok könyvtár tartalmazhat egy tippfájlt, de csak egy tippfájl fordulhat elő egy adott könyvtárban.
A projektre nulla vagy több tippfájl is hatással lehet. Ha nincsenek tippfájlok, az elemzési rendszer hibahelyreállítási technikákkal figyelmen kívül hagyja a meghatározhatatlan forráskódot. Ellenkező esetben az elemzési rendszer a következő stratégiát használja a tippek keresésére és gyűjtésére.
Keresési sorrend
Az elemzési rendszer a következő sorrendben keres tippeket tartalmazó fájlokat a könyvtárakban.
A Visual C++ (vcpackages) telepítési csomagját tartalmazó könyvtár. Ez a könyvtár egy beépített tippfájlt tartalmaz, amely a gyakran használt rendszerfájlok szimbólumait írja le, például a windows.h-t. Ennek következtében a projekt automatikusan örökli a legtöbb szükséges tippet.
A forrásfájl gyökérkönyvtárától a forrásfájlt tartalmazó könyvtárig vezető elérési út. Egy tipikus Visual Studio C++ projektben a gyökérkönyvtár tartalmazza a megoldást vagy a projektfájlt.
Ez alól a szabály alól kivételt képez, ha egy leállítási fájl a forrásfájl elérési útján található. A leállítási fájl minden cpp.stop nevű fájl. A leállítási fájl további vezérlést biztosít a keresési sorrend felett. A gyökérkönyvtár helyett az elemzési rendszer a stop fájlt tartalmazó könyvtárból a forrásfájlt tartalmazó könyvtárba keres. Egy tipikus projektben nincs szükség leállítási fájlra.
Tippgyűjtés
A tippfájl nulla vagy több tippet tartalmaz. A rendszer úgy definiál vagy töröl egy tippet, mint egy C/C++ makrót. Ez azt jelzi, hogy az #define előfeldolgozási irányelv létrehoz vagy újradefiniálja a tippet, és az #undef irányelv töröl egy tippet.
Az elemzési rendszer megnyitja az egyes tippfájlokat a korábban ismertetett keresési sorrendben. Az egyes fájlok tippjei egy hatékony tippkészletbe halmozódnak fel, majd az érvényes tippeket használva értelmezik a kódban szereplő azonosítókat.
Az elemzési rendszer az alábbi szabályok használatával gyűjti össze a tippeket:
Ha az új tipp egy még nem definiált nevet ad meg, az új tipp hozzáadja a nevet a tényleges tippekhez.
Ha az új tipp egy már definiált nevet ad meg, az új tipp újradefiniálja a meglévő tippet.
Ha az új tipp egy
#undefolyan irányelv, amely egy meglévő hatékony tippet határoz meg, az új tipp törli a meglévő tippet.
Az első szabály azt jelenti, hogy a tényleges tippek a korábban megnyitott tippfájloktól öröklődnek. Az utolsó két szabály azt jelenti, hogy a keresési sorrend későbbi részében lévő tippek felülírhatják a korábbi tippeket. Például felülbírálhatja a korábbi tippeket, ha létrehoz egy tippfájlt a forrásfájlt tartalmazó könyvtárban.
A tippek összegyűjtésének módját a Példa szakaszban találja.
Szemantika
A makrók létrehozásához és törléséhez ugyanazzal a szintaxissal hozhat létre és törölhet tippeket, mint az előfeldolgozási irányelvek. Valójában az elemzési rendszer a C/C++ előfeldolgozóval értékeli ki a tippeket. Az előfeldolgozási irányelvekről további információt #define irányelvben (C/C++) és #undef irányelvben (C/C++) talál.
Az egyetlen szokatlan szintaxiselem a , @=és @> a @<helyettesítő sztring. Ezek a hint-file-specifikus helyettesítő sztringek csak térképmakrókban használhatók. A térkép olyan makrók készlete, amelyek adatokat, függvényeket vagy eseményeket kapcsolnak össze más adatokkal, függvényekkel vagy eseménykezelőkkel. Az MFC például térképeket használ az üzenettérképek létrehozásához, az ATL pedig térképeket használ az objektumleképek létrehozásához. A hint-file-specifikus helyettesítő sztringek jelölik a térkép kezdő, köztes és záró elemeit. Csak a térképmakró neve jelentős. Ezért minden helyettesítő sztring szándékosan elrejti a makró implementációját.
A tippek a következő szintaxist használják:
| Szemantika | Értelmezés |
|---|---|
#define
hint-namereplacement-string#define
hint-name(paraméter, ...)csere-sztring |
Egy előfeldolgozási irányelv, amely egy új tippet határoz meg, vagy újradefiniálja a meglévő tippeket. Az irányelv után az előfeldolgozó lecseréli a forráskódban lévő hint-name minden előfordulását helyettesítő sztringre. A második szintaxisforma függvényszerű tippet határoz meg. Ha függvényszerű tipp jelenik meg a forráskódban, az előfeldolgozó először lecseréli a helyettesítő sztringben lévő paraméterek minden előfordulását a forráskód megfelelő argumentumára, majd lecseréli a hint-nevetcseresztringre. |
@< |
Egy tippfájl-specifikus cseresztring , amely a térképelemek egy halmazának kezdetét jelzi. |
@= |
Egy segédfájl-specifikus cseresztring , amely egy köztes térképelemet jelez. Egy térkép több térképelemet is tartalmazhat. |
@> |
Egy tippfájl-specifikus cseresztring , amely a térképelemek egy halmazának végét jelzi. |
#undef
hint-name |
Az előfeldolgozási irányelv, amely töröl egy meglévő tippet. A tipp nevét a hint-name azonosító adja meg. |
//
megjegyzés |
Egy egysoros megjegyzés. |
/*
megjegyzés*/ |
Többsoros megjegyzés. |
példa
Ez a példa bemutatja, hogyan halmozódnak fel tippek a tippfájlokból. Ebben a példában nem használjuk a leállítási fájlokat.
Az ábrán a Visual Studio C++ projekt néhány fizikai könyvtára látható. A , Debug, A1és A2 könyvtárakban vcpackagesvannak tippfájlok.
Tippek fájlkönyvtárak
Könyvtárak és tippfájl tartalma
Ez a lista a projekt azon könyvtárait jeleníti meg, amelyek emlékeztetőfájlokat és azok tartalmát tartalmazzák. A címtár-tippfájlban található számos tipp közül csak néhány szerepel a vcpackages listán:
vcpackages
// vcpackages (partial list) #define _In_ #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size)Hibakeresés
// 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
Hatékony tippek
Ez a táblázat a projekt forrásfájljaira vonatkozó hatályos tippeket sorolja fel:
Forrásfájl: A1_A2_B.cpp
Hatékony tippek:
// 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 }
Ezek a megjegyzések az előző listára vonatkoznak:
A tényleges tippek a
vcpackages,Debug,A1, ésA2könyvtárak.A tippfájl #undef
Debugirányelve eltávolította a#define _In_tippet avcpackageskönyvtár tippfájljában.A könyvtárban lévő tippfájl újradefiniálja
START_NAMESPACEaA1fájlt.A
#undefkönyvtárban lévőA2tipp eltávolította a könyvtár tippfájljának ésCBRACEa benne lévőDebugtippeketOBRACE.
Lásd még
Visual Studio C++-projektekhez létrehozott fájltípusok
#define irányelv (C/C++)
#undef irányelv (C/C++)
SAL-széljegyzetek