Pregunta

¿Alguien sabe cómo hacer que IntelliSense funcione de manera confiable cuando se trabaja en proyectos C/C++?Parece funcionar para aproximadamente 1 de cada 10 archivos.Visual Studio 2005 parece ser mucho mejor que 2008.

Editar:Si bien no es necesariamente una solución, la solución alternativa que se proporciona aquí:

Cómo hacer que IntelliSense funcione de manera confiable en Visual Studio 2008

Probablemente sea la mejor opción si quiero un sistema IntelliSense decente.

¿Fue útil?

Solución

También me di cuenta de que Intellisense en algún momento está "perdido" en algún gran proyecto.¿Por qué?Ni idea.

Por eso hemos comprado Asistencia visual (de software de tomate) y deshabilitó Intellisense eliminando el dll feacp.dll en el subdirectorio de Visual Studio (C:\Program Files\Microsoft Visual Studio 8\VC\vcpackages)

Esta no es una solución, sólo una solución alternativa.

Otros consejos

El intellisense nativo de C++ no funciona de manera confiable en ninguna versión de Visual Studio.Encuentro que hay dos problemas comunes:

1) Las rutas de los archivos de encabezado no están configuradas correctamente.Cuando encuentre un tipo en el que Intellisense no funciona, utilice el IDE para hacer clic en cada archivo de encabezado y encontrar el que contiene el tipo.(Haga clic derecho en #incluir y seleccione Abrir documento...).Si esto falla antes de llegar al archivo que declara el tipo, entonces este es su problema.Asegúrese de que las rutas de búsqueda del archivo de encabezado estén configuradas correctamente.

Y,

2) La base de datos intellisense está corrupta.Esto sucede todo el tiempo.Debe cerrar la solución, eliminar el archivo .ncb y luego volver a abrir la solución.Publiqué la macro que uso para esto en respuesta a otra pregunta. aquí.


El preprocesador también puede confundir a Intellisense, así que asegúrese de que cualquier #define durante la compilación también esté disponible para Intellisense.Aparte de eso, no sé qué más puede romperlo.No he visto ningún problema particular con las declaraciones directas.

Parece que hay esperanza en el horizonte para aquellos de nosotros que no podemos obtener Visual Assist:

Reconstrucción de Intellisense

¿Tiene algún complemento instalado (o desinstalado)?Encuentro que eso afecta mi intellisense.

Además de eso, asegúrese de que Herramientas->Opciones->Editor de texto->Todos los idiomas "Lista automática de miembros" e "Información de parámetros" estén marcados.

No uso VS2008 para C++, solo VB y C#, pero encuentro que cuando Intellisense deja de funcionar (verdadero para VS2003/2005/2008) es porque algo en el proyecto/archivo está roto, generalmente una mala referencia o código.

VB y C# tienen un soporte Intellisense mucho mejor debido a la capacidad de reflexionar sobre los ensamblados a los que se hace referencia para construir el árbol Intellisense.

C++ tiene que recorrer los archivos de inclusión para los prototipos de funciones y, si las rutas no son correctas, no encontrará todos los encabezados de los prototipos.

Mi solución a itellisense fue necesaria después de que esa horrible utilidad de refactorización minara mi código.El problema era un archivo de encabezado de clase que incluía un #include de sí mismo.La referencia recursiva destruye itellisense.Un síntoma de esto es si itellisense puede ver otras clases pero no la actual.También:

Utilice #pragma una vez para eliminar cargas de encabezado duplicadas

Si el proyecto ahora tarda mucho más en cargarse, eso significa que intenta dar sentido al conflicto que está causando la falta de soporte para su finalización.

A menudo es sólo un objeto de clase el que se ve afectado. Esto le muestra qué archivos (normalmente encabezados) debe mirar.

@Juan Richardson / @jonathan holanda

Mis inclusiones están configuradas correctamente, no hay problemas.También probé la reconstrucción de NCB varias veces pero nunca lo solucionó al 100%.

Tengo la sensación de que puede tener que ver con declaraciones anticipadas de clases.p.ej.Para reducir la complejidad de las inclusiones en los archivos de encabezado, normalmente hacemos algo como:

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

Me pregunto si eso lo arruina.¿Alguna otra idea?Definitivamente empeora cuanto más grande se vuelve su proyecto.

Tuve un problema muy molesto, Intellisense funcionaba sólo en algunos archivos, sin ninguna razón evidente...Me tomó un par de horas buscar en Google, ¡pero finalmente entendí que el motivo era una referencia recursiva!Estaba usando:

#ifndef CLASS_H
#define CLASS_H
...
#endif

para evitar la redefinición de símbolos, y esto a veces rompe el sentido intelectual en grandes proyectos.

Pero basta con comentar el ifndef-define-endif y poner un:

#pragma once 

al principio de los archivos de encabezado para evitar redefiniciones y hacer que Intellisense vuelva a funcionar =)=)

Al menos esto funcionó para mí, espero que sea útil...

Saludos Francesco

Recientemente estudié Intellisense en VS2008, mientras estoy desarrollando una biblioteca de álgebra lineal numérica C++ bastante grande donde se usan ampliamente plantillas y demás.Intellisense dejó de funcionar poco tiempo después del proyecto y en cierto modo me di por vencido, pero ahora se volvió realmente molesto sin él, así que me puse a investigar.Esto es lo que descubrí:

Suponiendo que hay un archivo que contiene código que "rompe" Intellisense,

  • si los archivos de encabezado que rompen Intellisense están en el proyecto, pero no #included, todavía funciona en el resto de archivos.
  • si están incluidos, pero no se utiliza ningún tipo declarado en el interior, todavía funciona
  • si se incluyen y se utiliza un tipo declarado en el interior, es posible que aún funcione un poco (sin Intellisense para los miembros, sin Intellisense después de la aparición de un tipo determinado, pero al menos nombres globales e información de argumentos antes)
  • Si Intellisense está roto en un archivo .cpp, aún puede funcionar en los demás donde el código problemático no está incluido o utilizado (pero imagino que si falla, se desactivará para todo el proyecto, aunque eso no sucedió). a mí)
  • Intellisense parece actualizarse después de una compilación exitosa (a veces no antes)
  • poner código roto dentro de cualquiera de #if 0, /* .. */ o // parece tranquilizar a Intellisense

De las funciones de C++ que utilicé, en realidad solo unas pocas rompen Intellisense:

  • comparación con '>' o '>=' en el parámetro de plantilla (p. ej. static_assert<(size > 0)>)
    • no se resuelve usando paréntesis dobles (static_assert<((size > 0))> no ayuda)
    • resuelto usando '<' o '<=' en su lugar (static_assert<0 < size> obras)
    • resuelto almacenando el valor en enum y usándolo para especializar la plantilla
  • La especialización explícita de la plantilla de función deshabilita la información de argumentos (p. ej. function<type>(args))
    • probablemente no pueda resolverlo (tal vez incluirlo en una macro), pero puedo vivir con que se rompa
  • creación de instancias del tipo de miembro de plantilla, como Matrix::MakeMatrixType<3, 3>::Result r;
    • Es un poco difícil entender exactamente por qué sucede esto (probablemente debido al uso de Eigen)
    • solución alternativa moviendo dicho código en un .cpp separado donde IS no funcionará (no siempre es posible)

Parecería que algunos de esos problemas se deben a algún análisis "simplificado", que es menos potente que un analizador C++ adecuado.Con la información anterior a mano, un método "confiable" para hacer que Intellisense funcione en un código existente:

  1. Configure un proyecto vacío (una aplicación de consola), cree Main.cpp con dummy void main() {} en eso.
  2. Incluya uno de sus archivos de encabezado rotos y math.h
  3. Compilación (debe compilarse para que Intellisense se actualice de manera confiable)
  4. Pruebe si Intellisense está funcionando escribiendo, por ejemplo. sin( y ver si aparece un argumento de ayuda.A veces, esto funcionaría, pero la ayuda de los miembros no, así que inténtelo también.
  5. Cree una instancia de algo en el archivo de encabezado, compílelo y vea si eso logra eliminar IS.
  6. Elimine el código del archivo culpable y vaya al paso 3
  7. Después de encontrar y corregir el código problemático, vuelva a colocar el código eliminado en el paso 5 y vuelva a intentarlo.
  8. Después de hacer que toda una clase funcione bien, crea una instancia de la siguiente clase, y así sucesivamente...

De esta manera me resultó fácil identificar las ubicaciones del código que generaban problemas (me doy cuenta de que esto podría ser inviable para proyectos realmente grandes, en mi caso, solo un archivo de 97 problemas generados).Tenga en cuenta que "Construir" aquí se refiere a la compilación, no es necesario que finalice la etapa de vinculación, por lo que los elementos externos no resueltos están bien, el IS debe actualizarse de todos modos.

Otro método para actualizar IS (además de compilar) es guardar todo, cerrar el espacio de trabajo, eliminar el archivo .ncb y volver a abrirlo.Luego espere 'Actualizando Intellisense...(N)' para desaparecer de la barra de estado (N cuenta hacia cero, si no llega hasta el final, muestra el progreso donde ocurrieron los problemas).Esto me pareció bastante tedioso.

Acerca de este problema, noté algo interesante (en Visual Studio 2010):para resolver este problema he cambiado #include La sintaxis en mis archivos de encabezado, antes era (proyecto antiguo realizado con VS 2005 y reabierto usando VS 2010):

#include <myfile.h> 

y soluciono esto con:

#include "myfile.h"

¡Después de que Intellisense comience a funcionar correctamente!¡Espero que esto pueda ayudar!

Tuve que restablecer la configuración...

C:\Archivos de programa\Microsoft Visual Studio 9.0\Common7\IDE>devenv.exe /ResetSettings

hilo sobre esto aquí

El problema está en los archivos .vcproj.

Descubrirá que si cambia al modo de lanzamiento desde el modo de depuración, compila y luego prueba Intellisense, a menudo funciona.

Cierre Visual Studio.Si busca los archivos .vcproj en su proyecto, edítelos y busque las dos primeras instancias de AdditionalIncludeDirectories.El valor de esto debería parecerse a "..\,....\" en lugar de "../..".

Vuelva a abrir su proyecto, deje que Intellisense termine de construirse y luego debería arreglarse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top