Поделиться через


Файлы подсказок

A файл подсказок Visual Studio помогает интегрированной среде разработки (IDE) интерпретировать идентификаторы Visual C++, например имена функций и макросов.При открытии проекта Visual C++, интегрированная среда разработки по система анализа анализирует код в каждый исходный файл в проекте и собирает информацию обо всех идентификаторах.Затем эта информация используется интегрированная среда разработки для поддержки функций, таких как В представлении классов браузер и Панель навигации.

Система анализа, появившаяся в Visual C++ 2010, распознает синтаксис C/C++, но может неправильно интерпретировать инструкции, содержащие макросы.Если макрос вызывает исходный код становится синтаксически некорректным в виде инструкции могут быть неправильно распознаны.Инструкция может стать синтаксически правилен, когда исходный код компилируется, а препроцессор заменит идентификатор макроса с его определением. Система анализа работает без повторного построения проекта, поскольку она использует файлы подсказок для интерпретации макросов. Поэтому функция браузера например В представлении классов сразу доступно.

Файл подсказок содержит настраиваемые пользователем подсказки, которые имеют тот же синтаксис определений макросов C/C++.Visual C++ включает встроенный файл подсказок, достаточный для большинства проектов, но можно создавать собственные файлы подсказок, чтобы улучшить способ Visual Studio обрабатывает идентификаторов.

Сценарий

Предположим, что следующий код в исходный файл, просматриваемый с В представлении классов обозреватель.В STDMETHOD макрос объявляет метод с именем myMethod который принимает один параметр и возвращает указатель на ЗНАЧЕНИЕ HRESULT.

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

В приведенных ниже макроопределениях находятся в отдельном файле заголовка.

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

Система анализа не может интерпретировать исходный код, так как объявить функцию с именем STDMETHOD, и это объявление синтаксически неверен, так как он содержит два списка параметров.Система анализа не открывается файл заголовка для обнаружения, определения STDMETHOD, STDMETHODCALLTYPE, и ЗНАЧЕНИЕ HRESULT макросы.Поскольку система анализа не может интерпретировать. STDMETHOD макрос, она пропускает инструкцию целиком и продолжает анализ.

Система анализа не использует файлы заголовков, поскольку проект может зависеть от одного или нескольких важных файлов заголовков.При изменении любого файла заголовка, система анализа должна будет выполнять повторную проверку всех файлов заголовка в проекте, что замедлит работу интегрированной среды разработки.Вместо этого система анализа использует подсказки, которые указывают способ обработки STDMETHOD, STDMETHODCALLTYPE, и ЗНАЧЕНИЕ HRESULT макросы.

Как узнать, что требуется подсказка?И если требуется подсказка какого типа следует использовать?Один знак, что требуется подсказка Если идентификатора в представлении В представлении классов не согласуется с представлением в Редактор.Например, В представлении классов Неверное может не отображать член класса, который точно существует, или имя члена.Дополнительные сведения о типах подсказок, которые решить типичные проблемы, что макросов требуется подсказка см? ниже в этом разделе.

Архитектура

Файлы подсказок хранятся в физических каталогах, отображаемых не в логических каталогах Обозреватель решений.Необходимо добавить файл подсказок в проект файл подсказок вступил в силу.Система анализа использует файлы подсказок только после анализа исходных файлов.

Каждый файл подсказок имеет имя CPP.hint.Поэтому многие каталоги могут содержать файл подсказок, но только один файл подсказок может возникать в конкретном каталоге.

Проект может повлиять или несколько файлов подсказок.Если файлы подсказок отсутствуют, система анализа использует методы восстановления после ошибок, чтобы игнорировать неинтерпретируемые фрагменты кода.В противном случае система анализа использует следующие стратегии для обнаружения и сбора подсказок.

Порядок поиска

Система анализа осуществляет каталоги для файлов подсказок в следующем порядке.

  • Каталог, содержащий пакет установки (Visual C++vcpackages).Этот каталог содержит встроенный файл подсказок, описывающий символы в часто используемых системных файлах, таких как Windows.h.Следовательно проект автоматически наследует большую часть необходимых подсказок, которые ему необходимы.

  • Путь из корневого каталога исходного файла в каталог, содержащий сам исходный файл.В большинстве проектов Visual C++ корневой каталог содержит файл решения или проекта.

    Исключением из этого правила является Если Стоп-файл — путь к файлу исходного кода.Стоп-файл обеспечивает дополнительный уровень контроля над порядком поиска и представляет собой любой файл с именем CPP.Stop.Вместо запуска из корневого каталога, система анализа осуществляет поиск из каталога, содержащего стоп-файл в каталог, содержащий исходный файл.В типичном проекте Стоп-файл не требуется.

Сбор подсказок

Файл подсказок содержит ноль или больше подсказки.Подсказки определяются и удаляются подобно макросам C/C++.То есть #define Директива препроцессора создает или переопределяет подсказку, а #undef Директива удаляет ее.

Система анализа открывает каждый файл подсказок в указанном выше порядке поиска, собирает подсказки каждого файла в набор Действующие подсказки, а затем использует действующие подсказки для интерпретации идентификаторов в коде.

Система анализа использует следующие правила для сбора подсказок.

  • Если новая подсказка задает имя, которое еще не определено, новая подсказка добавляет имя действующих подсказок.

  • Если новая подсказка задает имя, которое уже определено, новая подсказка переопределяет имеющуюся подсказку.

  • Если новая подсказка #undef директива указывает имеющуюся действующую подсказку, новая подсказка удаляет имеющуюся подсказку.

Первое правило означает, что действующие подсказки наследуются из ранее открытых файлов подсказок.Последние два правила означают, что подсказки, обнаруженные позже в порядке поиска могут переопределить подсказки, которые были обнаружены ранее.Например можно переопределить все имеющиеся подсказки, если создать файл подсказок в каталог, содержащий исходный файл.

Иллюстрацию сбора подсказок см. Пример раздел данного раздела.

Синтаксис

Подсказки создаются и удаляются с помощью синтаксиса директив препроцессора, создавать и удалять макросы.На самом деле система анализа использует препроцессор C/C++ для вычисления подсказок.Дополнительные сведения о директивах препроцессора см. Директива #define (C/C++) и Директива #undef (C/C++).

Единственными непривычными элементами синтаксиса являются @<, @=, и @> строки замены.Это файл подсказок замены определенной строки, используемые только с карта макросы.Карта представляет собой набор макросов, которые связывают данные, функции и события для других данных, функций и обработчики событий.Например, MFC используются для создания схемы сообщений, и ATL используются для создания Сопоставляет объект.Строки замены определенных подсказкам указания начального, промежуточного и конечного элементов сопоставления.Важен только имя макроса сопоставления.Таким образом каждая строка сопоставления намеренно скрывает реализацию макроса.

В подсказках используется следующий синтаксис.

Синтаксис

Значение

#defineИмя подсказкиСтрока замены

#defineИмя подсказки(параметр, ...)Строка замены

Директива препроцессора, которая определяет новую подсказку или переопределяет имеющуюся подсказку.После директивы препроцессор заменяет каждое вхождение Имя подсказки в исходном коде с Строка замены.

Вторая синтаксическая форма определяет функцию подсказка.Если подсказка происходит в исходном коде, препроцессор сначала заменяет каждое вхождение параметр в Строка замены на соответствующий аргумент в исходном коде, а затем заменяет Имя подсказки с Строка замены.

@<

Указанный файл подсказок Строка замены Указывает начало набора элементов сопоставления.

@=

Указанный файл подсказок Строка замены Указывает, что промежуточный элемент сопоставления.Сопоставление может иметь несколько элементов сопоставления.

@>

Указанный файл подсказок Строка замены Указывает конец набора элементов сопоставления.

#undefИмя подсказки

Директива препроцессора, которая удаляет имеющуюся подсказку.Предоставленные имя подсказки Имя подсказки идентификатор.

//комментарий

Однострочный комментарий.

/*комментарий*/

Многострочный комментарий.

Что макросов требуется подсказка?

Макросы определенных типов могут мешать система анализа.В этом разделе описаны типы макросов, которые могут вызывать проблемы и типа подсказок, можно создать для решения этой проблемы.

Критические макросы

Некоторые макросы привести к неправильной интерпретации исходного кода системой анализа, но можно пропустить без ущерба для работы в Интернете.Например (язык исходного кода заметкиSAL) макросы разрешаются в атрибуты C++, которые помогают находить ошибки программ.Если вы хотите игнорировать заметки SAL при просмотре кода, может потребоваться создать файл подсказок, который скрывает заметки.

Следующий исходный код в поле параметр введите FormatWindowClassName() функция PXSTR, и имя параметра szBuffer.Тем не менее анализа ошибок системы _Pre_notnull_ и _Post_z_ SAL для типа параметра или имени параметра.

Исходный код:

Static void FormatWindowClassName(_Pre_notnull_ _Post_z_ PXSTR szBuffer)

Стратегии: Определение NULL

Стратегии в этой ситуации является трактовка заметок SAL, как если бы их не существовало.Для этого укажите подсказку, строкой подстановки равно null.Следовательно, система анализа не обрабатывает примечания, а также В представлении классов обозреватель не отображает их.(Visual C++ включает встроенный файл подсказок, который скрывает заметки SAL.)

Файл подсказок:

#define _Pre_notnull_

Элементы языка скрытого C/C++

Является стандартной причиной, что система анализа неверно интерпретирует код, если макрос может скрывать C/C++ препинания или ключевое слово маркер.То есть что макрос может содержать половину из пары знаков препинания, такие как <>, [], {}, и ().

В следующем исходном коде START_NAMESPACE макрос скрывает непарную левую фигурную скобку){).

Исходный код:

#define START_NAMESPACE пространство имен MyProject {

Стратегии: Прямое копирование

Если семантика макроса являются критическими для работы в Интернете, создайте подсказку, которая идентична макросу.Система анализа разрешит макрос в определение в файле подсказок.

Обратите внимание, что если макрос в исходном файле содержит другие макросы, эти макросы будут интерпретированы только в том случае, если они уже находятся в наборе действующих подсказок.

Файл подсказок:

#define START_NAMESPACE пространство имен MyProject {

Карты

Сопоставление состоит из макросов, которые определяют начальный элемент, конечный элемент и ноль или более промежуточных элементов.Система анализа неверно интерпретирует сопоставления, поскольку каждый макрос сопоставления скрывает элементы языка C/C++, а синтаксис заявления C/C++ распределяется между несколькими отдельными макросами.

Определяет следующий исходный код BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY, и END_CATEGORY_MAP макросы.

Исходный код:

#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 ); }

Стратегии: Определение элементов сопоставления

Укажите подсказки для начала, середины (если есть) и конец элементов сопоставления.Используйте специальные строки подстановки сопоставления, @<, @=, и @>.Дополнительные сведения см. Синтаксис раздел в этом разделе.

Файл подсказок:

// 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() @>

Составные макросы

Составные макросы содержат один или несколько типов макросов, неверно интерпретируемых системой анализа.

Следующий исходный код содержит START_NAMESPACE макрос, который задает начало области пространства имен, и BEGIN_CATEGORY_MAP макрос, который задает начало сопоставления.

Исходный код:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Стратегии: Прямое копирование

Создание подсказки для START_NAMESPACE и BEGIN_CATEGORY_MAP макросы, а затем создать подсказку для NSandMAP макрос, который является таким же, как было показано ранее для исходного кода.Кроме того Если составной макрос состоит из только критические макросы и пробелы, можно определить подсказку, строка замены будет определение null.

В этом примере предполагается START_NAMESPACE уже имеется подсказка, как описано в подразделе Элементы языка скрытого C/C++ Подзаголовок.И предположим BEGIN_CATEGORY_MAP уже имеется подсказка, как описано выше в Карты.

Файл подсказок:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Неудобные макросы

Некоторые макросы могут интерпретироваться системой анализа, но исходный код трудным для чтения, поскольку макрос является длинные или сложные.Для удобства чтения можно предоставить подсказку, которая упрощает отображение макроса.

Исходный код:

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

Стратегии: Упрощение

Создайте подсказку, которая отображает более простое определение макроса.

Файл подсказок:

#define STDMETHOD(methodName) void* methodName

Пример

В следующем примере показано, как происходит сбор подсказок из файлов подсказок.В этом примере не используются Стоп-файлы.

На следующем рисунке показаны некоторые физические каталоги проекта Visual C++.Файлы подсказок расположены в vcpackages, Отладка, A1, и A2 каталоги.

Каталоги файлов подсказок

Общие и зависящие от проекта каталоги файлов подсказок.

Каталоги и содержимое файлов подсказок

В следующей таблице перечислены каталоги этого проекта, которые содержат файлы подсказок и содержимое этих файлов подсказок.Только некоторые из множества подсказок в vcpackages файл подсказок в каталоге перечислены.

Каталог

Содержимое файлов подсказок

vcpackages

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

Отладка

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

Действующие подсказки

В следующей таблице перечислены действующие подсказки для исходных файлов в проекте.

Исходный файл

Действующие подсказки

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 }

Следующие замечания относятся к предшествующей таблице.

  • Действующие подсказки получены из vcpackages, Отладка, A1, и A2 каталоги.

  • В #undef в директиве Отладка удалить файл подсказок #define _In_ Совет в vcpackages файл подсказок в каталоге.

  • Файл подсказок в A1 переопределяет каталог START_NAMESPACE.

  • В #undef Совет в A2 каталог удалила подсказки OBRACE и CBRACE в Отладка файл подсказок в каталоге.

См. также

Ссылки

Директива #define (C/C++)

Директива #undef (C/C++)

Схемы сообщений (MFC)

Основные понятия

Типы файлов, создаваемых для проектов Visual C++

Примечания SAL

Другие ресурсы

Создание окон среды и управление ими

Макросы сопоставления сообщения (библиотека ATL)

Макросы сопоставления объекта