Domanda

Qualcuno sa come far funzionare IntelliSense in modo affidabile quando si lavora in progetti C/C++?Sembra funzionare per circa 1 file su 10.Visual Studio 2005 sembra essere molto migliore del 2008.

Modificare:Sebbene non sia necessariamente una soluzione, la soluzione alternativa fornita qui:

Come fare in modo che IntelliSense funzioni in modo affidabile in Visual Studio 2008

Probabilmente è la soluzione migliore se voglio un sistema IntelliSense decente.

È stato utile?

Soluzione

Mi sono anche reso conto che Intellisense a volte viene "perso", in qualche grande progetto.Perché?Nessuna idea.

Questo è il motivo per cui abbiamo acquistato Assistenza visiva (da Software per pomodori) e disabilitato Intellisense eliminando la dll feacp.dll nella sottodirectory di Visual Studio (C:\Programmi\Microsoft Visual Studio 8\VC\vcpackages)

Questa non è una soluzione, solo una soluzione alternativa.

Altri suggerimenti

Intellisense nativo di C++ non funziona in modo affidabile in nessuna versione di Visual Studio.Trovo che ci siano due problemi comuni:

1) I percorsi dei file di intestazione non sono impostati correttamente.Quando trovi un tipo in cui intellisense non funziona, utilizza l'IDE per fare clic su ciascun file di intestazione per trovare quello contenente il tipo.(Fare clic con il tasto destro su #include e selezionare Apri documento...).Se fallisce prima di arrivare al file che dichiara il tipo, allora questo è il tuo problema.Assicurati che i percorsi di ricerca dei file di intestazione siano impostati correttamente.

E,

2) Il database IntelliSense è corrotto.Questo accade TUTTO il tempo.È necessario chiudere la soluzione, eliminare il file .ncb e quindi riaprire la soluzione.Ho pubblicato la macro che utilizzo per questo in risposta a un'altra domanda Qui.


Il preprocessore può anche confondere intellisense, quindi assicurati che eventuali #define durante la compilazione siano disponibili anche per intellisense.A parte questo, non so cos'altro possa romperlo.Non ho riscontrato problemi particolari con le dichiarazioni anticipate.

Sembra che ci sia speranza all'orizzonte per quelli di noi che non possono ottenere Visual Assist:

Ricostruire l'Intellisense

Hai qualche componente aggiuntivo installato (o disinstallato)?Trovo che ciò influisca sul mio intellisense.

Oltre a ciò, assicurati semplicemente che Strumenti->Opzioni->Editor di testo->Tutte le lingue "Elenco automatico membri" e "Informazioni sui parametri" siano selezionati.

Non utilizzo VS2008 per C++, solo VB e C#, ma trovo che quando intellisense smette di funzionare (vero per VS2003/2005/2008) è perché qualcosa nel progetto/file è rotto, di solito un riferimento o un codice errato.

VB e C# hanno un supporto IntelliSense molto migliore grazie alla capacità di riflettere sugli assembly a cui si fa riferimento per creare l'albero IntelliSense.

C++ deve percorrere i file di inclusione per i prototipi di funzioni e, se i percorsi non sono corretti, non troverà tutte le intestazioni del prototipo.

La mia correzione a itellisense è stata necessaria dopo che quella terribile utility di refactoring ha tritato il mio codice.Il problema era un file di intestazione della classe che includeva un #include di se stesso.Il riferimento ricorsivo distrugge itellisense.Un sintomo di ciò è se itellisense può vedere altre classi ma non quella corrente.Anche:

Utilizza #pragma una volta per eliminare i caricamenti di intestazioni duplicati

Se il progetto ora richiede molto più tempo per essere caricato, è logico cercare di dare un senso al conflitto che sta causando la mancanza di supporto per il completamento.

Spesso è interessato solo un oggetto di classe. Questo mostra quali file (solitamente intestazioni) guardare.

@John Richardson / @Jonathan Olanda

I miei include sono impostati correttamente, nessun problema lì.Ho anche provato più volte la ricostruzione della BCN, ma non è mai stata risolta al 100%.

Ho la sensazione che potrebbe avere a che fare con le dichiarazioni anticipate delle classi.per esempio.per ridurre la complessità degli include nei file header normalmente facciamo qualcosa del tipo:

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

Mi chiedo se questo rovina tutto?Altre idee?La situazione peggiora sicuramente quanto più grande diventa il tuo progetto.

Ho avuto un problema molto fastidioso, intellisense funzionava solo in alcuni file, senza alcun motivo evidente...Mi ci sono volute un paio d'ore per cercare su Google, ma alla fine ho capito che il motivo era davvero un riferimento ricorsivo!Stavo usando:

#ifndef CLASS_H
#define CLASS_H
...
#endif

per evitare la ridefinizione dei simboli, che a volte rompe l'intellisense nei grandi progetti.

Ma è sufficiente commentare ifndef-define-endif e inserire un:

#pragma once 

all'inizio dei file di intestazione per evitare comunque ridefinizioni e far funzionare di nuovo Intellisense =)=)

Almeno questo ha funzionato per me, spero che sia utile...

Cin cin Francesco

Recentemente ho studiato Intellisense in VS2008, poiché sto sviluppando una libreria di algebra lineare numerica C++ piuttosto ampia in cui modelli e simili sono ampiamente utilizzati.Intellisense ha smesso di funzionare poco dopo l'inizio del progetto e in un certo senso mi sono arreso, ma ora senza di esso è diventato davvero fastidioso, quindi ho iniziato a indagare.Questo è quello che ho scoperto:

Supponendo che ci siano file contenenti codice che "interrompe" Intellisense,

  • se i file di intestazione che interrompono Intellisense sono presenti nel progetto, ma non lo sono #included, funziona ancora nel resto dei file
  • se sono inclusi, ma non viene utilizzato alcun tipo dichiarato all'interno, funziona comunque
  • se sono inclusi e viene utilizzato un tipo dichiarato all'interno, potrebbe funzionare ancora un po' (nessun Intellisense per i membri, nessun Intellisense dopo l'occorrenza del tipo specificato, ma almeno nomi globali e informazioni sugli argomenti prima)
  • se Intellisense è danneggiato in un file .cpp, può continuare a funzionare negli altri in cui il codice problematico non è incluso o utilizzato (ma immagino che se si bloccasse gravemente, verrà disabilitato per l'intero progetto, anche se ciò non è accaduto a Me)
  • Intellisense sembra essere aggiornato dopo la compilazione riuscita (a volte non prima)
  • inserendo codice non funzionante all'interno di uno qualsiasi di #if 0, /* .. */ O // sembra mettere a proprio agio Intellisense

Delle funzionalità C++ che ho utilizzato, in realtà solo poche interrompono Intellisense:

  • confronto con '>' o '>=' nel parametro del modello (ad es. static_assert<(size > 0)>)
    • non risolto utilizzando le doppie parentesi (static_assert<((size > 0))> non aiuta)
    • risolto utilizzando invece '<' o '<=' (static_assert<0 < size> lavori)
    • risolto memorizzando il valore in enum e utilizzandolo per specializzare il modello
  • la specializzazione esplicita del modello di funzione disabilita le informazioni sull'argomento (ad es. function<type>(args))
    • probabilmente non riesco a risolverlo (magari racchiuderlo in una macro), ma posso convivere con il fatto che sia rotto
  • istanziazione del tipo di membro del modello, come ad esempio Matrix::MakeMatrixType<3, 3>::Result r;
    • è difficile capire esattamente il motivo per cui ciò accade (probabilmente a causa dell'uso di Eigen)
    • soluzione alternativa spostando tale codice in un .cpp separato in cui IS non funzionerà (non sempre possibile)

Sembrerebbe che alcuni di questi problemi siano dovuti ad un parser "semplificato", che è meno potente di un vero parser C++.Con le informazioni di cui sopra a portata di mano, un metodo "affidabile" per far funzionare Intellisense in un codice esistente:

  1. Configura un progetto vuoto (un'app console), crea Main.cpp con dummy void main() {} dentro.
  2. Includi uno dei tuoi file di intestazione danneggiati e math.h
  3. Compila (deve essere compilato affinché Intellisense possa aggiornarsi in modo affidabile)
  4. Verifica se Intellisense funziona digitando ad es. sin( e vedere se viene visualizzato l'aiuto per l'argomento.A volte, questo potrebbe funzionare, ma l'aiuto dei membri no, quindi prova anche quello.
  5. Crea un'istanza di qualcosa nel file header, crea, vedi se riesce a uccidere IS.
  6. Rimuovi il codice dal file colpevole e vai al passaggio 3
  7. Dopo aver trovato e corretto il codice problematico, ripristina il codice rimosso nel passaggio 5 e riprova
  8. Dopo aver fatto funzionare bene un'intera classe, crea un'istanza della classe successiva e così via...

Ho trovato facile in questo modo individuare le posizioni del codice che creava problemi (mi rendo conto che questo potrebbe non essere fattibile per progetti molto grandi, nel mio caso solo un singolo file su 97 ha creato problemi).Tieni presente che "Build" qui si riferisce alla compilazione, non è necessario che la fase di collegamento venga completata, quindi gli elementi esterni non risolti sono ok, l'IS dovrebbe aggiornarsi a prescindere.

Un altro metodo per aggiornare IS (diverso dalla creazione) è salvare tutto, chiudere l'area di lavoro, eliminare il file .ncb e riaprirlo.Quindi attendere "Aggiornamento Intellisense ...(N)' scomparirà dalla barra di stato (N conta verso zero, se non arriva fino in fondo, mostra in qualche modo il progresso dove si sono verificati i problemi).L'ho trovato piuttosto noioso.

A proposito di questo problema ho notato qualcosa di interessante (su Visual Studio 2010):per risolvere questo problema ho cambiato #include sintassi nei miei file di intestazione, prima era (vecchio progetto realizzato con VS 2005 e riaperto utilizzando VS 2010):

#include <myfile.h> 

e risolvo questo problema con:

#include "myfile.h"

Dopo che IntelliSense inizia a funzionare correttamente!Spero che questo possa aiutare!

ho dovuto resettare le impostazioni...

C:\Programmi\Microsoft Visual Studio 9.0\Common7\IDE>devenv.exe /ResetSettings

discussione su questo qui

Il problema riguarda i file .vcproj.

Scoprirai che se passi alla modalità di rilascio dalla modalità debug, costruisci, quindi provi intellisense, spesso funziona.

Chiudi Visual Studio.Se cerchi i file .vcproj nel tuo progetto, modificali e cerca le prime due istanze di AdditionalIncludeDirectories.Il valore dovrebbe essere simile a "..\,....\" anziché a "../..".

Riapri il tuo progetto, lascia che Intellisense finisca di costruire, quindi dovrebbe essere risolto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top