Compartir a través de


Archivos de indicaciones

A archivo de sugerencia ayuda a la de Visual Studio el entorno de desarrollo integrado (IDE) interprete los identificadores de Visual C++, tales como los nombres de funciones y macros.Al abrir un proyecto de Visual C++, el IDE sistema de análisis analiza el código en cada archivo de código fuente en el proyecto y recopila información acerca de cada identificador.A continuación, el IDE utiliza esa información para admitir características como la Vista de clases explorador y el Barra de exploración.

El sistema de análisis, que se introdujo en Visual C++ 2010, comprende la sintaxis de C o C++, pero puede interpretar erróneamente una instrucción que contiene una macro.La instrucción se puede interpretar si la macro hace que el código fuente sea sintácticamente incorrecto al escribirse.La instrucción puede ser sintácticamente correcta cuando se compila el código fuente y el preprocesador reemplaza el identificador de la macro con su definición. El sistema de análisis funciona sin tener que generar el proyecto, ya que utiliza archivos de sugerencia para interpretar las macros. Por lo tanto, una característica de exploración como Vista de clases está disponible inmediatamente.

Un archivo de sugerencia contiene personalizables por el usuario sugerencias, que tienen la misma sintaxis que las definiciones de macro de C/C ++.Visual C++ incluye un archivo de sugerencia integrado que es suficiente para la mayoría de los proyectos, pero puede crear sus propios archivos de sugerencia para mejorar la forma en que Visual Studio controla los identificadores.

Escenario

Se supone que es el siguiente código en un archivo de código fuente que se examina con el Vista de clases navegador.El STDMETHOD macro declara un método denominado myMethod que toma un parámetro y devuelve un puntero a una HRESULT.

/ / Archivo de código de origen. STDMETHOD(MyMethod) (int parámetro1);

Son las siguientes definiciones de macro en un archivo de registro inicial independiente.

/ / Archivo de encabezado. #define STDMETHOD(method) HRESULT (STDMETHODCALLTYPE * método) #define STDMETHODCALLTYPE __stdcall #define HRESULT void *

El sistema de análisis no puede interpretar el código fuente porque una función denominada STDMETHOD aparece como declarada y dicha declaración es sintácticamente incorrecta porque tiene dos listas de parámetros.El sistema de análisis no abre el archivo de encabezado para detectar las definiciones para el STDMETHOD, STDMETHODCALLTYPE, y HRESULT macros.Dado que el sistema de análisis no puede interpretar el STDMETHOD macro, pasa por alto la instrucción al completo y, a continuación, sigue analizando.

El sistema de análisis no utiliza archivos de encabezado porque su proyecto puede depender de uno o más archivos de encabezado importantes.Si se cambia ningún archivo de encabezado, el sistema de análisis podría tener que volver a examinar todos los archivos de encabezado en el proyecto, lo que reduce el rendimiento del IDE.En su lugar, el sistema de análisis utiliza sugerencias que especifican cómo controlar el STDMETHOD, STDMETHODCALLTYPE, y HRESULT macros.

¿Cómo sé que se requiere una sugerencia?Y si necesita una sugerencia, ¿qué debería crear?Es una señal de que se requiere una sugerencia si la vista de un identificador en Vista de clases no es coherente con la vista en el Editor.Por ejemplo, Vista de clases es posible que no mostrar un miembro de clase que sabe que existe o el nombre del miembro no es correcta.Para obtener más información acerca de los tipos de sugerencias que resuelven problemas comunes, vea la ¿qué Macros Require A Hint? sección más adelante en este tema.

Arquitectura

Archivos de sugerencia pertenecen a directorios físicos, no los directorios lógicos que se muestra en la Explorador de soluciones.No es necesario agregar un archivo de sugerencia para el proyecto para el archivo de sugerencia tenga efecto.El sistema de análisis utiliza archivos de sugerencia sólo cuando analiza archivos de código fuente.

Cada archivo de sugerencia se denomina cpp.Hint.Por lo tanto, muchos directorios pueden contener un archivo de sugerencia, pero solo puede haber en un directorio determinado.

El proyecto puede verse afectado por cero o más archivos de sugerencia.Si no hay ningún archivo de sugerencia, el sistema de análisis utiliza técnicas de recuperación de errores para omitir el código fuente indescifrable.De lo contrario, el sistema de análisis utiliza la siguiente estrategia para buscar y recopilar sugerencias.

Dd997977.collapse_all(es-es,VS.110).gifOrden de búsqueda

El sistema de análisis busca los directorios de archivos de sugerencia en el siguiente orden.

  • El directorio que contiene el paquete de instalación de Visual C++)vcpackages).Este directorio contiene un archivo de sugerencia integrado que describe los símbolos en los archivos del sistema utilizados con frecuencia, como Windows.h.Por lo tanto, el proyecto hereda automáticamente la mayoría de las sugerencias que necesita.

  • La ruta de acceso desde el directorio raíz de un archivo de código fuente en el directorio que contiene el archivo de origen propio.En un proyecto típico de Visual C++, el directorio raíz contiene el archivo de solución o proyecto.

    La excepción a esta regla es si un Detener archivo está en la ruta de acceso al archivo de origen.Un archivo de detención proporciona control adicional sobre el orden de búsqueda y es cualquier archivo que se denomina cpp.Stop.En lugar de iniciar desde el directorio raíz, el sistema de análisis busca desde el directorio que contiene el archivo de detención en el directorio que contiene el archivo de origen.En un proyecto típico, no es necesario un archivo de detención.

Dd997977.collapse_all(es-es,VS.110).gifRecopilación de sugerencias

Un archivo de sugerencia contiene cero o más sugerencias.Define una sugerencia o eliminar igual que una macro de C/C ++.Es decir, el #define Directiva de preprocesador crea o redefine una sugerencia y el #undef directiva elimina una sugerencia.

El sistema de análisis se abre cada archivo de sugerencia en el orden de búsqueda que se ha descrito anteriormente, se acumulan las sugerencias de cada uno de ellos en un conjunto de sugerencias vigentesy, a continuación, utiliza las sugerencias vigentes para interpretar los identificadores en el código.

El sistema de análisis utiliza las siguientes reglas para acumular las sugerencias.

  • Si la nueva sugerencia especifica un nombre que ya no está definido, la nueva sugerencia agrega el nombre a las sugerencias vigentes.

  • Si la nueva sugerencia especifica un nombre que ya se ha definido, la nueva sugerencia vuelve a definir la sugerencia existente.

  • Si la nueva sugerencia es un #undef la directiva que especifica una sugerencia vigente existente, la nueva sugerencia elimina la existente.

La primera regla significa que sugerencias vigentes se heredan de los archivos de sugerencia abiertos previamente.Las dos últimas reglas significan que sugerencias que se producen más adelante en el orden de búsqueda, pueden reemplazar sugerencias para el que se ha producido anteriormente.Por ejemplo, puede reemplazar cualquier sugerencia anterior si crea un archivo de sugerencia en el directorio que contiene un archivo de origen.

Para obtener una descripción de cómo se recopilan las sugerencias, consulte la En el ejemplo se sección más adelante en este tema.

Dd997977.collapse_all(es-es,VS.110).gifSintaxis

Sugerencias se crean y eliminan con la misma sintaxis que las directivas de preprocesador que crean y eliminan las macros.De hecho, el sistema de análisis utiliza el preprocesador de C o C++ para evaluar las sugerencias.Para obtener más información acerca de las directivas de preprocesador, vea Directiva #define (C/C++) y Directiva #undef (C/C++).

Los elementos de sintaxis inusuales sólo son el @<, @=, y @> cadenas de reemplazo.Estas son cadenas de reemplazo específicas de archivo de sugerencia que se utilizan sólo con mapa macros.Un mapa es un conjunto de macros relacionadas con datos, funciones o eventos, otros datos, las funciones o los controladores de eventos.Por ejemplo, MFC se utiliza para crear mapas mapas de mensajes, y ATL se utiliza para crear mapas mapas de objeto.Las cadenas de reemplazo específicas del archivo de sugerencia indican los elementos inicial, intermedios y final de un mapa.Sólo el nombre de una macro de mapa es significativo.Por lo tanto, cada cadena de reemplazo oculta intencionalmente la implementación de la macro.

Las sugerencias usan la sintaxis siguiente.

Sintaxis

Significado

#defineSugerencia de nombrecadena de reemplazo

#defineSugerencia de nombre(parámetro, ...)cadena de reemplazo

Una directiva de preprocesador que define una nueva sugerencia o vuelve a definir una sugerencia existente.Después de la directiva, el preprocesador reemplaza cada aparición de Sugerencia de nombre en el código fuente con cadena de reemplazo.

La segunda forma de sintaxis define una sugerencia de este tipo.Si se produce una sugerencia de este tipo en el código fuente, el primero de preprocesador reemplaza cada aparición de parámetro en el cadena de reemplazo con el argumento correspondiente del código fuente y, a continuación, reemplaza Sugerencia de nombre con cadena de reemplazo.

@<

Un determinado archivo de sugerencia cadena de reemplazo indica el inicio de un conjunto de elementos de mapa.

@=

Un determinado archivo de sugerencia cadena de reemplazo que indica que un elemento de mapa intermedio.Un mapa puede tener varios elementos de mapa.

@>

Un determinado archivo de sugerencia cadena de reemplazo indica el final de un conjunto de elementos de mapa.

#undefSugerencia de nombre

La directiva de preprocesador que elimina una sugerencia existente.El nombre de la sugerencia es proporcionado por el Sugerencia de nombre identificador.

//comentario

Una línea de comentario.

/*comentario*/

Un comentario multilínea.

¿Qué Macros que requieren una sugerencia?

Ciertos tipos de macros pueden interferir con el sistema de análisis.Esta sección describen los tipos de macros que pueden provocar un problema y el tipo de sugerencia que puede crear para solucionar el problema.

Dd997977.collapse_all(es-es,VS.110).gifMacros disruptivas

Algunas macros que el sistema de análisis interprete incorrectamente el código fuente, pero pueden omitirse sin perjudicar la experiencia de exploración.Por ejemplo, el (lenguaje de anotación del código fuenteSAL) las macros resolución a los atributos de C++ que le ayudarán a errores de programación de encontrar.Si desea omitir las anotaciones SAL al examinar el código, desea crear un archivo de sugerencia que oculte la anotación.

En el siguiente código fuente, el parámetro de tipo para el FormatWindowClassName() la función es PXSTR, y es el nombre del parámetro szBuffer.Sin embargo, los errores de sistema al analizar el _Pre_notnull_ y _Post_z_ Anotaciones SAL para el tipo de parámetro o el nombre del parámetro.

Código fuente:

FormatWindowClassName void estático(_Pre_notnull_ _Post_z_ SzBuffer PXSTR)

Estrategia: Definición de null

La estrategia en esta situación consiste en tratar las anotaciones SAL como si no existieran.Para ello, especifique una sugerencia cuya cadena de reemplazo es null.Por lo tanto, el sistema de análisis omite las anotaciones y el Vista de clases no muestra en explorador.(Visual C++ incluye un archivo de sugerencia integrado que oculta la anotación SAL).

Archivo de sugerencia:

#define _Pre_notnull_

Dd997977.collapse_all(es-es,VS.110).gifElementos del lenguaje C/c ++ oculta

Una razón habitual que el sistema de análisis malinterpreta el código fuente es si una macro oculta un C o C++ signo de puntuación o palabra clave símbolo (token).Es decir, una macro puede contener la mitad de un par de signos de puntuación, como <>, [], {}, y ().

En el siguiente código fuente, el START_NAMESPACE macro oculta una (llave de apertura sin par{).

Código fuente:

#define START_NAMESPACE espacio de nombres MyProject {

Estrategia: Copia directa

Si la semántica de una macro es fundamental para la experiencia de exploración, crear un indicio de que es idéntico a la macro.El sistema de análisis resuelve la macro a la definición del archivo de sugerencia.

Tenga en cuenta que si la macro en el archivo de origen contiene otras macros, las macros sólo se interpretan si ya están en el conjunto de sugerencias vigentes.

Archivo de sugerencia:

#define START_NAMESPACE espacio de nombres MyProject {

Dd997977.collapse_all(es-es,VS.110).gifMapas de

Un mapa se compone de macros que designan un elemento inicial, el elemento final y cero o más elementos intermedios.El sistema de análisis malinterpreta mapas porque cada macro de mapa oculta elementos del lenguaje C/C ++ y la sintaxis de una instrucción completa de C/C ++ se distribuye en diversas macros independientes.

El código fuente siguiente define el BEGIN_CATEGORY_MAP, IMPLEMENTED_CATEGORY, y END_CATEGORY_MAP macros.

Código fuente:

#define BEGIN_CATEGORY_MAP(x) \ estático throw() ATL::_ATL_CATMAP_ENTRY * GetCategoryMap() struct const {\ [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); }

Estrategia: Identificar los elementos del mapa

Especifique sugerencias para el inicio, el centro (si existe) y el final de un mapa de los elementos.Utilice las cadenas de reemplazo especiales para mapas, @<, @=, y @>.Para obtener más información, consulte el Sintaxis sección de este tema.

Archivo de sugerencia:

/ / Iniciar de la asignación. #define BEGIN_CATEGORY_MAP(x) @<
/ / Intermedio elemento map. #define IMPLEMENTED_CATEGORY(catid) @=
/ / Intermedio elemento map. #define REQUIRED_CATEGORY(catid) @=
/ / Fin del mapa. #define END_CATEGORY_MAP() @>

Dd997977.collapse_all(es-es,VS.110).gifMacros compuestas

Las macros compuestas contienen uno o varios de los tipos de macro que se debe confundir el sistema de análisis.

El siguiente código fuente contiene la START_NAMESPACE macro, que especifica el principio de un ámbito de espacio de nombres, y el BEGIN_CATEGORY_MAP macro, que especifica el inicio de un mapa.

Código fuente:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Estrategia: Copia directa

Crear sugerencias para la START_NAMESPACE y BEGIN_CATEGORY_MAP las macros y, a continuación, cree una sugerencia para el NSandMAP macro que es el mismo que aparece anteriormente para el código fuente.O bien, si una macro compuesta consta de únicamente macros disruptivas y espacios en blanco, puede definir una sugerencia cuya cadena de reemplazo sea una definición nula.

En este ejemplo se supone START_NAMESPACE ya tiene una sugerencia, tal como se describe en este tema en el Elementos del lenguaje C/c ++ oculta subtítulo.Y se supone BEGIN_CATEGORY_MAP tiene una sugerencia como se describió anteriormente en Mapas de.

Archivo de sugerencia:

#define NSandMAP START_NAMESPACE BEGIN_CATEGORY_MAP

Dd997977.collapse_all(es-es,VS.110).gifMacros no convenientes

Algunas macros pueden interpretarse por el sistema de análisis, pero el código fuente es difícil de leer porque la macro es larga o compleja.Para facilitar su lectura, puede proporcionar una sugerencia que simplifique la presentación de la macro.

Código fuente:

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

Estrategia: Simplificación de la

Crear un indicio de que se muestra una definición de macro más sencilla.

Archivo de sugerencia:

#define STDMETHOD(methodName) void * methodName

En el ejemplo se

En el ejemplo siguiente se muestra cómo se acumulan las sugerencias de los archivos de sugerencia.Archivos de parada no se utilizan en este ejemplo.

En la siguiente ilustración se muestra algunos de los directorios físicos en un proyecto de Visual C++.Son archivos de sugerencia en el vcpackages, Depurar, A1, y A2 directorios.

Dd997977.collapse_all(es-es,VS.110).gifDirectorios de archivos de sugerencia

Directorios de archivos de indicaciones comunes y específicos del proyecto.

Dd997977.collapse_all(es-es,VS.110).gifLos directorios y el contenido del archivo de sugerencia

En la siguiente tabla muestra los directorios en este proyecto que contienen archivos de sugerencia y el contenido de dichos archivos.Sólo algunas de las muchas sugerencias en el vcpackages archivo de sugerencia del directorio se enumeran.

Directorio

Contenido del archivo de sugerencia

vcpackages

/ / vcpackages (lista parcial) #define _In_ #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size)

Depurar

/ Debug throw (x) de RAISE_EXCEPTION(x) de #define OBRACE {#define CBRACE} de #undef _In_ #define #define START_NAMESPACE namespace MyProject {#define END_NAMESPACE}

A1

/ / Espacio de nombres de A1 #define START_NAMESPACE {A1Namespace

A2

/ / A2 #undef OBRACE #undef CBRACE

Dd997977.collapse_all(es-es,VS.110).gifSugerencias vigentes

En la tabla siguiente se enumera las sugerencias vigentes para los archivos de origen de este proyecto.

Archivo de código fuente

Sugerencias vigentes

A1_A2_B.cpp

/ / vcpackages (lista parcial) #define _In_opt_ #define _In_z_ #define _In_opt_z_ #define _In_count_(size) / Debug... #define RAISE_EXCEPTION(x) throw (x) / / espacio de nombres de A1 #define START_NAMESPACE A1Namespace {/ /...Depurar #define END_NAMESPACE}

Las notas siguientes se aplican a la tabla anterior.

  • Las sugerencias vigentes pertenecen a la vcpackages, Depurar, A1, y A2 directorios.

  • El #undef la directiva en el Depurar archivo de sugerencia se quita la _In_ de #define Sugerencia en el vcpackages archivo de sugerencia del directorio.

  • El archivo de sugerencia en el A1 redefine el directorio START_NAMESPACE.

  • El #undef Sugerencia en el A2 las sugerencias para quitar el directorio OBRACE y CBRACE en el Depurar archivo de sugerencia del directorio.

Vea también

Referencia

Directiva #define (C/C++)

Directiva #undef (C/C++)

Mapas de mensajes MFC)

Conceptos

Tipos de archivos creados para proyectos de Visual C++

Anotaciones de la SAL

Otros recursos

Crear y controlar las ventanas del entorno

Macros de mapa de mensajes (ATL)

Macros de mapa de objetos