Udostępnij za pośrednictwem


Pliki wskazówki

A Wskazówka pliku pomaga w Visual Studio zintegrowane środowisko programistyczne (IDE) interpretują identyfikatorów języka Visual C++, takie jak nazwy funkcji i makr.Po otwarciu projektu Visual C++, IDE's analizowanie systemu analizuje kod w każdym pliku źródłowego w projekcie, a także gromadzącego informacje o każdy identyfikator.Następnie IDE używa tych informacji do obsługi funkcji, takich jak Widok klas przeglądarki i Pasek nawigacyjny.

Podczas analizowania system, który został wprowadzony w Visual C++ 2010, rozumie składni języka C/C++, ale może błędnie interpretuje instrukcję, która zawiera makro.Jeśli makra powoduje, że kod źródłowy się syntaktycznie nieprawidłowa, jak zostały napisane, instrukcja może być błędnie zinterpretowana.Instrukcja może stać się poprawne syntaktycznie podczas kompilowania kodu źródłowego i zastępuje preprocesser Identyfikator makro z jego definicją. Podczas analizowania system działa bez konieczności tworzenia projektu, ponieważ używa on pliki wskazówki do interpretacji makra. W związku z tym Przeglądanie funkcji takich jak Widok klas jest natychmiast dostępna.

Konfigurowalny przez użytkownika zawiera plik Wskazówka wskazówki dotyczące serwerów, które mają taką samą składnię jak C/C++ definicje makr.Visual C++ zawiera wskazówkę wbudowany plik, który jest wystarczające dla większości projektów, ale można utworzyć własne pliki podpowiedź do poprawy sposobu, w Visual Studio obsługuje identyfikatory.

Scenariusz

Zakładać, że następujący kod w pliku źródłowym, który bada z Widok klas Przeglądarka.Z STDMETHOD Makro deklaruje metodę o nazwie myMethod który przyjmuje jeden parametr i zwraca wskaźnik do HRESULT.

// Source code file.
STDMETHOD(myMethod)(int parameter1);

Następujące definicje makr znajdują się w pliku oddzielny nagłówek.

// Header file.
#define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * method)
#define STDMETHODCALLTYPE __stdcall
#define HRESULT void*

Analizy systemu nie może zinterpretować kodu źródłowego, ponieważ funkcja o nazwie STDMETHOD wydaje się być zadeklarowane, a deklaracja ta jest syntaktycznie nieprawidłowa, ponieważ ma ona dwie listy parametrów.System analizy nie otwiera pliku nagłówka odkryć definicje STDMETHOD, STDMETHODCALLTYPE, i HRESULT makra.Ponieważ nie może zinterpretować systemu analizy STDMETHOD makro, ignoruje całej instrukcji i kontynuuje analizy.

Podczas analizowania system nie używa plików nagłówkowych ponieważ projektu może zależeć od jednego lub więcej plików ważne nagłówka.Jeśli zmiany dowolnego pliku nagłówka, analizy systemu może być konieczne ponownie rozpatruje wszystkie pliki nagłówków w projekcie, który spowalnia działanie IDE.Zamiast tego system analizowania używa wskazówek, które umożliwia określenie sposobu obsługi STDMETHOD, STDMETHODCALLTYPE, i HRESULT makra.

Skąd wiesz że potrzebujesz podpowiedzi?I jeśli potrzebujesz wskazówkę, jakie należy utworzyć?Jeden znak, że potrzebne są wskazówki jest Jeśli identyfikator w widoku Widok klas jest niezgodne z widoku w Edytor.Na przykład, Widok klas może nie wyświetlaj członek klasy, której wiadomo, że istnieje lub nazwa element członkowski jest nieprawidłowa.Aby uzyskać więcej informacji o typach wskazówki dotyczące rozwiązywania typowych problemów, zobacz co makra wymagają wskazówkę? sekcji w dalszej części tego tematu.

Architektura

Wskazówka pliki odnoszą się do fizycznych katalogów, katalogów logicznych przedstawionych w Solution Explorer.Nie masz Dodawanie pliku wskazówek do projektu dla pliku wskazówek mieć wpływ.Podczas analizowania system korzysta z plików Wskazówka tylko wtedy, gdy analizuje pliki źródłowe.

Nosi nazwę każdego pliku wskazówek cpp.Hint.W związku z tym wiele katalogów mogą zawierać pliku wskazówek, ale tylko jedną wskazówkę pliku może wystąpić z określonego katalogu.

Projekt może mieć wpływ przez zero lub więcej plików podpowiedź.Jeśli nie ma żadnych plików Wskazówka, analizowania system używa technik odzyskiwania błąd do zignorowania kodu źródłowego nie do odczytania.W przeciwnym razie analizowania system używa następujących strategii znaleźć i zebrać wskazówki.

Kolejność wyszukiwania

Podczas analizowania system przeszukuje katalogi dla plików Wskazówka w następującej kolejności.

  • Katalogu zawierającego pakiet instalacyjny dla programu Visual C++)vcpackages).Ten katalog zawiera wbudowane Wskazówka plik, który w tym artykule opisano symbole w systemie często używanych plików, takich jak Windows.h.W związku z tym projektu automatycznie dziedziczy większość wskazówek, które potrzebuje.

  • Ścieżka z katalogu źródłowego pliku do katalogu zawierającego plik źródłowy, sam.W typowym projekcie Visual C++ katalog główny zawiera plik rozwiązania lub projektu.

    Wyjątkiem od tej reguły jest Jeśli zatrzymać odtwarzanie pliku jest to ścieżka do pliku źródłowego.Plik stop zapewnia dodatkową kontrolę nad kolejność wyszukiwania i jest każdy plik o nazwie cpp.stop.Zamiast uruchamiać z katalogu głównego, system analizowania rozpocznie wyszukiwanie od katalogu zawierającego plik stop do katalogu zawierającego plik źródłowy.W typowym projekcie nie trzeba pliku stop.

Wskazówka zbieranie

Wskazówka plik zawiera zero lub więcej wskazówki dotyczące serwerów.Wskazówka jest zdefiniowana lub usuwane, podobnie jak makra C/C++.Oznacza to #define dyrektywy preprocesora tworzy lub nowo wskazówkę oraz #undef dyrektywa usuwa wskazówkę.

Podczas analizowania system otwiera każdego pliku wskazówek w celu wyszukiwania opisano wcześniej, gromadzi się wskazówki dotyczące każdego pliku na zestaw skuteczne wskazówki, a następnie używa skuteczne wskazówki do interpretacji identyfikatory w kodzie.

System analizy stosowane są następujące reguły do akumulacji wskazówek.

  • Określa nazwę, która nie jest już zdefiniowane nową wskazówkę dotyczącą nową wskazówkę dotyczącą dodaje nazwę skutecznych podpowiedzi.

  • Jeśli nową wskazówkę dotyczącą Określa nazwę, która jest już zdefiniowany, nową wskazówkę dotyczącą nowo istniejących podpowiedź.

  • Jeśli jest nową wskazówkę dotyczącą #undef dyrektywa, która określa skutecznych podpowiedzi, nową wskazówkę dotyczącą usuwa istniejące wskazówkę.

Pierwszą regułę oznacza, że skuteczne wskazówki zostały odziedziczone Wskazówka poprzednio otwieranych plików.Ostatnie dwie reguły oznacza, że wskazówek, które występują w dalszej części kolejność wyszukiwania można zastąpić wskazówek, które miały miejsce wcześniej.Na przykład można zastąpić poprzedni wskazówki po utworzeniu pliku wskazówek w katalogu zawierającego plik źródłowy.

Dla sceny jak gromadzone są wskazówki dotyczące serwerów, zobacz Przykład sekcja w dalszej części tego tematu.

Składnia

Wskazówki dotyczące tworzenia i usunięte z taką samą składnię jak dyrektywy preprocesora, które tworzenie i usuwanie makra.W rzeczywistości podczas analizowania system używa C/C++ preprocesora do oceny wskazówki.Aby uzyskać więcej informacji na temat dyrektywy preprocesora zobacz #define — dyrektywa (C/C++) i #undef — dyrektywa (C/C++).

Elementy tylko nietypowej składni @<, @=, i @> ciągów zastępczych.Są to ciągi określony element zastępczy pliku wskazówek, które są używane tylko z Mapa makra.Mapa jest zestaw makr, które dotyczą danych, funkcji lub zdarzenia innych danych, funkcji lub procedury obsługi zdarzeń.Na przykład, MFC do tworzenia wykorzystuje mapy mapy wiadomości, i ATL do tworzenia wykorzystuje mapy Obiekt mapy.Ciągi określony element zastępczy pliku wskazówek wskazują początkowego, pośredniego i końcowego elementów mapy.Istotne jest tylko nazwa makra mapy.Dlatego każdy ciąg zastępujący celowo ukrywa wykonania makra.

Wskazówki dotyczące serwerów należy użyć następującej składni.

Składnia

Znaczenie

#defineWskazówka dotycząca nazwyciąg zastępujący

#defineWskazówka dotycząca nazwy(Parametr, ...)ciąg zastępujący

Dyrektywa preprocesser, która definiuje nową wskazówkę dotyczącą lub istniejące wskazówkę dotyczącą na nowo definiuje pojęcie.Po dyrektywy preprocesora zamienia każde wystąpienie Wskazówka dotycząca nazwy w kodzie źródłowym z ciąg zastępujący.

W drugim formularzu składni definiuje wskazówkę jak funkcja.Jeśli Wskazówka jak funkcja występuje w kodzie źródłowym, pierwszy preprocesora zamienia każde wystąpienie Parametr w ciąg zastępujący z argumentem odpowiedniego kodu źródłowego, a następnie zastępuje Wskazówka dotycząca nazwy z ciąg zastępujący.

@<

Określonego pliku wskazówek ciąg zastępujący który wskazuje początek zestawu elementów mapy.

@=

Określonego pliku wskazówek ciąg zastępujący który wskazuje element mapy pośrednich.Mapa może mieć wiele elementów mapy.

@>

Określonego pliku wskazówek ciąg zastępujący oznacza koniec zestawu elementów mapy.

#undefWskazówka dotycząca nazwy

Dyrektywy preprocesora usuwa istniejące wskazówkę dotyczącą.Nazwa Wskazówka jest świadczone przez Wskazówka dotycząca nazwy identyfikator.

//komentarz

Komentarz jednowierszowy.

/*komentarz*/

Komentarze obejmujące wiele wierszy.

Co makra wymagają wskazówkę?

Niektóre typy makr może kolidować z systemu podczas analizy.W tej sekcji opisano typy makr, które może spowodować problem i rodzaju wskazówkę, że można utworzyć w celu rozwiązania tego problemu.

Makra nieodpowiednie

Niektóre makra spowodować, że system analizowania błędnie interpretuje kod źródłowy, ale można go zignorować osłabiając przeglądania sieci.Na przykład (język opisu kodu źródłowegoSAL) makra rozwiązać atrybutów języka C++, które pomogą Ci znaleźć błędy programowania.Jeżeli chcesz ignorować SAL adnotacji podczas przeglądania kodu, można utworzyć pliku wskazówek, który ukrywa adnotacji.

Następujący kod źródłowy w polu wpisz parametr FormatWindowClassName() funkcja jest PXSTR, a nazwa parametru jest zmienna szBuffer.Jednak podczas analizowania błędów systemu _Pre_notnull_ i _Post_z_ Adnotacje SAL typ parametru lub nazwy parametru.

Kod źródłowy:

statyczne void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR szBuffer)

Strategia: Definicja wartości null

Strategia w tej sytuacji jest traktować adnotacje SAL, tak, jakby nie istniał.W tym celu należy określić wskazówkę, którego ciąg zastępujący jest null.W rezultacie podczas analizowania system ignoruje adnotacje oraz Widok klas Przeglądarka nie wyświetla je.(Visual C++ zawiera plik wbudowany Wskazówka ukrywa adnotacji SAL.)

Pliku wskazówek:

#define _Pre_notnull_

Elementy języka C/C++ ukryte

Typowe przyczyny, że system analizowania zawiera nieprawidłową kwalifikację kod źródłowy jest, jeśli makro powoduje ukrycie C/C++ znak interpunkcyjny lub słowo kluczowe token.Oznacza to makra mogą zawierać połowę pary znaków, takich jak <>, [], {}, i ().

W poniższym kodzie źródła START_NAMESPACE makro powoduje ukrycie nieparzysty lewego nawiasu klamrowego){).

Kod źródłowy:

#define START_NAMESPACE obszar nazw MyProject {

Strategia: Bezpośredniego kopiowania

Jeśli semantykę makra są krytyczne dla działania przeglądarki, należy utworzyć wskazówkę, która jest identyczny do makra.Podczas analizowania systemu usuwa makro definicji określonej w pliku wskazówek.

Należy zauważyć, że jeśli makro w pliku źródłowym zawiera inne makra, te makra, są interpretowane tylko wtedy, gdy są one już zbiór wskazówek skuteczne.

Pliku wskazówek:

#define START_NAMESPACE obszar nazw MyProject {

Mapy

Mapa zawiera makra, które wyznaczają początkowy elementu, element końcowy i zero lub więcej elementów pośrednich.Analizy systemu zawiera nieprawidłową kwalifikację mapy, ponieważ każde makro map ukrywa elementy języka C/C++, a składnia pełną instrukcję C/C++ jest rozproszone w wielu oddzielnych makra.

Definiuje następujący kod źródłowy BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY, i END_CATEGORY_MAP makra.

Kod źródłowy:

#define BEGIN_CATEGORY_MAP(x)\
static const struct ATL::_ATL_CATMAP_ENTRY* GetCategoryMap() throw() {\
static const struct ATL::_ATL_CATMAP_ENTRY pMap[] = {
#define IMPLEMENTED_CATEGORY( catid ) { _ATL_CATMAP_ENTRY_IMPLEMENTED, &catid },
#define END_CATEGORY_MAP()\
   { _ATL_CATMAP_ENTRY_END, NULL } };\
   return( pMap ); }

Strategia: Zidentyfikować elementy mapy

Określanie wskazówki dotyczące rozpoczęcia, drugie (jeśli istnieje) i zakończenia elementów mapy.Użyj mapy specjalne ciągów zastępczych, @<, @=, i @>.Aby uzyskać więcej informacji, zobacz Składnia sekcję w tym temacie.

Pliku wskazówek:

// Start of the map.
#define BEGIN_CATEGORY_MAP(x) @<
// Intermediate map element.
#define IMPLEMENTED_CATEGORY( catid ) @=
// Intermediate map element.
#define REQUIRED_CATEGORY( catid ) @=
// End of the map.
#define END_CATEGORY_MAP() @>

Projekt wstępny makra

Projekt wstępny makra zawierają jedną lub więcej typów makro, które należy mylić analizy systemu.

Następujący kod źródłowy zawiera START_NAMESPACE makra, która określa początek zakresu nazw, oraz BEGIN_CATEGORY_MAP makra, która określa początek mapy.

Kod źródłowy:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Strategia: Bezpośredniego kopiowania

Wskazówki dotyczące tworzenia START_NAMESPACE i BEGIN_CATEGORY_MAP makra, a następnie utworzyć wskazówkę dla NSandMAP makro jest taka sama, jak pokazano wcześniej dla kodu źródłowego.Alternatywnie Jeśli kompozytowe makro składa się tylko makra nieodpowiednie i białe miejsca, można zdefiniować wskazówki, których ciąg zastępujący jest null definicji.

W tym przykładzie przyjęto założenie START_NAMESPACE zgodnie z opisem w tym temacie ma już podpowiedź Elementy języka C/C++ ukryte podpozycja.I przejęcia BEGIN_CATEGORY_MAP ma wskazówkę, jak opisano wcześniej w Mapy.

Pliku wskazówek:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Niewygodne makra

Niektóre makra mogą być interpretowane przez system podczas analizowania, ale kod źródłowy jest trudna do odczytania, ponieważ makro jest długi lub zbyt skomplikowany.Dla poprawienia czytelności możesz podać wskazówkę, która ułatwia wyświetlanie makro.

Kod źródłowy:

#define STDMETHOD(methodName) HRESULT (STDMETHODCALLTYPE * methodName)

Strategia: Uproszczenie

Utworzyć wskazówkę, która służy do wyświetlania definicji makra prostsze.

Pliku wskazówek:

#define STDMETHOD(methodName) void* methodName

Przykład

Poniższy przykład ilustruje, jak wskazówki są kumulowane z plików podpowiedź.Stop pliki nie są używane w tym przykładzie.

Poniższa ilustracja przedstawia niektóre z katalogów fizycznych w projekcie programu Visual C++.Wskazówka pliki znajdują się w vcpackages, Program Debug: polecenie, A1, i A2 katalogi.

Wskazówka katalogów plików

Wskazówki dotyczące projektu i wspólnych katalogów plików.

Katalogi i zawartość pliku Wskazówka

Poniższa lista zawiera w tym projekcie katalogi zawierające pliki wskazówki i zawartość tych plików Wskazówka.Tylko niektóre z wielu wskazówek w vcpackages Katalog pliku wskazówek są wymienione.

Katalog

Wskazówka dotycząca zawartości pliku

vcpackages

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

Program Debug: polecenie

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

Skuteczne wskazówki

Poniższa lista zawiera wskazówki skuteczne dla plików źródłowych w tym projekcie.

Plik źródłowy

Skuteczne wskazówki

A1_A2_B.cpp

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

Następujące uwagi stosuje się do poprzedniej tabeli.

  • Skuteczne wskazówki są od vcpackages, Program Debug: polecenie, A1, i A2 katalogi.

  • Z #undef w dyrektywie w Program Debug: polecenie Wskazówka plik usunięty #define _In_ Wskazówka w vcpackages Katalog pliku wskazówek.

  • Pliku wskazówek w A1 katalog na nowo definiuje pojęcie START_NAMESPACE.

  • Z #undef Wskazówka w A2 wskazówki dotyczące usuwany katalog OBRACE i CBRACE w Program Debug: polecenie Katalog pliku wskazówek.

Zobacz też

Informacje

#define — dyrektywa (C/C++)

#undef — dyrektywa (C/C++)

Mapy komunikatów (MFC)

Koncepcje

Typy plików utworzonych dla projektów Visual C++

Adnotacje SAL

Inne zasoby

Tworzenie i kontrolowanie okien środowiska

Komunikat mapę makra (ATL)

Obiekt mapy makra