Frage

Weiß jemand, wie man IntelliSense bei der Arbeit in C/C++-Projekten zuverlässig zum Laufen bringt?Es scheint bei etwa einer von zehn Dateien zu funktionieren.Visual Studio 2005 scheint viel besser zu sein als 2008.

Bearbeiten:Obwohl dies nicht unbedingt eine Lösung ist, finden Sie hier die Lösung:

So sorgen Sie dafür, dass IntelliSense in Visual Studio 2008 zuverlässig funktioniert

Ist wahrscheinlich die beste Wahl, wenn ich ein anständiges IntelliSense-System möchte.

War es hilfreich?

Lösung

Mir ist auch klar geworden, dass Intellisense bei einem großen Projekt manchmal „verloren“ geht.Warum?Keine Ahnung.

Aus diesem Grund haben wir gekauft Visueller Assistent (aus Tomatensoftware) und deaktivierte Intellisense durch Löschen der DLL feacp.dll im Visual Studio-Unterverzeichnis (C:\Programme\Microsoft Visual Studio 8\VC\vcpackages).

Dies ist keine Lösung, sondern nur ein Workaround.

Andere Tipps

Natives C++-Intellisense funktioniert in keiner Version von Visual Studio zuverlässig.Ich finde, dass es zwei häufige Probleme gibt:

1) Header-Dateipfade sind nicht korrekt eingerichtet.Wenn Sie einen Typ finden, bei dem Intellisense nicht funktioniert, klicken Sie mit der IDE durch jede Header-Datei, um die Datei zu finden, die den Typ enthält.(Klicken Sie mit der rechten Maustaste auf #include und wählen Sie Dokument öffnen...).Wenn dies fehlschlägt, bevor Sie zu der Datei gelangen, die den Typ deklariert, liegt das Problem bei Ihnen.Stellen Sie sicher, dass die Suchpfade für Headerdateien korrekt eingerichtet sind.

Und,

2) Die Intellisense-Datenbank ist beschädigt.Das passiert STÄNDIG.Sie müssen die Lösung schließen, die .ncb-Datei löschen und die Lösung dann erneut öffnen.Ich habe das Makro, das ich dafür verwende, als Antwort auf eine andere Frage gepostet Hier.


Der Präprozessor kann Intellisense auch verwirren. Stellen Sie daher sicher, dass alle #defines während des Builds auch für Intellisense verfügbar sind.Abgesehen davon weiß ich nicht, was es sonst noch kaputt machen kann.Ich habe keine besonderen Probleme mit Vorwärtsdeklarationen gesehen.

Es sieht so aus, als gäbe es Hoffnung für diejenigen von uns, die Visual Assist nicht erhalten können:

Intellisense neu aufbauen

Haben Sie Add-Ins installiert (oder deinstalliert)?Ich finde, das wirkt sich auf meine Intelligenz aus.

Stellen Sie außerdem sicher, dass unter Extras->Optionen->Texteditor->Alle Sprachen „Mitglieder automatisch auflisten“ und „Parameterinformationen“ aktiviert sind.

Ich verwende VS2008 nicht für C++, sondern nur VB und C#, aber ich finde, wenn Intellisense nicht mehr funktioniert (gilt für VS2003/2005/2008), liegt das daran, dass etwas im Projekt/in der Datei kaputt ist – normalerweise eine fehlerhafte Referenz oder ein fehlerhafter Code.

VB und C# verfügen über eine viel bessere Intellisense-Unterstützung, da sie die referenzierten Assemblys zum Aufbau des Intellisense-Baums berücksichtigen können.

C++ muss die Include-Dateien für Funktionsprototypen durchsuchen, und wenn die Pfade nicht korrekt sind, werden nicht alle Prototyp-Header gefunden.

Meine Korrektur von itellisense war erforderlich, nachdem dieses schreckliche Refactor-Dienstprogramm meinen Code zerhackt hatte.Das Problem war eine Klassenheaderdatei, die ein #include von sich selbst enthielt.Der rekursive Verweis zerstört itellisense.Ein Symptom dafür ist, dass itellisense andere Klassen sehen kann, aber nicht die aktuelle.Auch:

Verwenden Sie #pragma einmal, um doppelte Header-Ladevorgänge zu vermeiden

Wenn das Laden des Projekts jetzt sehr viel länger dauert, versucht itellisense, den Konflikt zu verstehen, der die Ursache dafür ist, dass es keine Abschlussunterstützung gibt.

Oft ist nur ein Klassenobjekt betroffen. Dies zeigt Ihnen, welche Dateien (normalerweise Header) Sie sich ansehen müssen.

@John Richardson / @Jonathan Holland

Meine Includes sind korrekt eingerichtet, es gibt keine Probleme.Ich habe den NCB-Neuaufbau auch mehrere Male ausprobiert, aber er behebt das Problem nie zu 100 %.

Ich habe das Gefühl, dass es möglicherweise mit Vorwärtsdeklarationen von Klassen zu tun hat.z.B.Um die Komplexität von Includes in Header-Dateien zu reduzieren, gehen wir normalerweise so vor:

class MyPredeclared;

class SomeOtherClass
{
private:
    MyPredeclared* m_pPointer;
}

Ich frage mich, ob das alles vermasselt?Irgendwelche anderen Ideen?Es wird definitiv schlimmer, je größer Ihr Projekt wird.

Ich hatte ein sehr ärgerliches Problem: Intellisense funktionierte ohne ersichtlichen Grund nur in einigen Dateien ...Es hat mich ein paar Stunden gekostet, mich durch Google zu wühlen, aber schließlich wurde mir klar, dass der Grund tatsächlich eine rekursive Referenz war!Ich habe Folgendes verwendet:

#ifndef CLASS_H
#define CLASS_H
...
#endif

um eine Neudefinition von Symbolen zu vermeiden, was bei großen Projekten manchmal zu einer Unterbrechung der Intelligenz führt.

Aber es reicht aus, das ifndef-define-endif zu kommentieren und Folgendes einzufügen:

#pragma once 

am Anfang der Header-Dateien, um Neudefinitionen zu vermeiden und Intellisense wieder funktionieren zu lassen =)=)

Zumindest hat das bei mir funktioniert, ich hoffe, es ist nützlich ...

Prost Francesco

Ich habe kürzlich Intellisense in VS2008 studiert, da ich eine ziemlich große C++-Bibliothek für numerische lineare Algebra entwickle, in der Vorlagen und dergleichen häufig verwendet werden.Kurz nach Beginn des Projekts hat Intellisense aufgehört, an dem Projekt zu arbeiten, und ich habe es irgendwie aufgegeben, aber jetzt wurde es ohne Intellisense wirklich nervig, also machte ich mich an die Nachforschungen.Folgendes habe ich herausgefunden:

Angenommen, es gibt eine oder mehrere Dateien, die Code enthalten, der Intellisense „zerstört“,

  • wenn Header-Dateien, die Intellisense unterbrechen, im Projekt vorhanden sind, dies jedoch nicht der Fall ist #included, es funktioniert immer noch in den restlichen Dateien
  • Wenn sie enthalten sind, aber kein darin deklarierter Typ verwendet wird, funktioniert es immer noch
  • Wenn sie enthalten sind und ein darin deklarierter Typ verwendet wird, funktioniert es möglicherweise immer noch ein wenig (kein Intellisense für Mitglieder, kein Intellisense nach dem Auftreten des angegebenen Typs, aber zumindest globale Namen und Argumentinformationen davor).
  • Wenn Intellisense in einer .cpp-Datei defekt ist, kann es in den anderen weiterhin funktionieren, in denen der problematische Code nicht enthalten ist oder verwendet wird (aber ich kann mir vorstellen, dass es bei einem schlimmen Absturz für das gesamte Projekt deaktiviert wird, obwohl das nicht passiert ist Mich)
  • Intellisense scheint nach erfolgreicher Kompilierung aktualisiert zu werden (manchmal auch nicht vorher)
  • Einfügen von defektem Code in eines davon #if 0, /* .. */ oder // scheint Intellisense zu beruhigen

Von den C++-Funktionen, die ich verwendet habe, brechen tatsächlich nur wenige Intellisense:

  • Vergleich mit '>' oder '>=' im Template-Parameter (z.B. static_assert<(size > 0)>)
    • nicht durch die Verwendung doppelter Klammern gelöst (static_assert<((size > 0))> hilft nicht)
    • gelöst, indem stattdessen '<' oder '<=' verwendet wird (static_assert<0 < size> funktioniert)
    • Gelöst durch Speichern des Werts in enum und Verwenden dieses Werts zum Spezialisieren der Vorlage
  • Die explizite Spezialisierung von Funktionsvorlagen deaktiviert Argumentinformationen (z. B. function<type>(args))
    • wahrscheinlich nicht in der Lage zu lösen (vielleicht in ein Makro einbinden), aber ich kann damit leben, dass es kaputt ist
  • Instanziierung des Vorlagenelementtyps, z Matrix::MakeMatrixType<3, 3>::Result r;
    • Es ist ziemlich schwierig, genau herauszufinden, warum das passiert (wahrscheinlich wegen der Verwendung von Eigen).
    • Problemumgehung durch Verschieben des entsprechenden Codes in eine separate CPP-Datei, in der IS nicht funktioniert (nicht immer möglich)

Es scheint, dass einige dieser Probleme auf ein „vereinfachtes“ Parsing zurückzuführen sind, das weniger stark ist als ein richtiger C++-Parser.Mit den oben genannten Informationen zur Hand, eine „zuverlässige“ Methode, um Intellisense in einem vorhandenen Code zum Laufen zu bringen:

  1. Richten Sie ein leeres Projekt (eine Konsolen-App) ein und erstellen Sie Main.cpp mit Dummy void main() {} drin.
  2. Fügen Sie eine Ihrer defekten Header-Dateien hinzu und math.h
  3. Build (es muss kompiliert werden, damit Intellisense zuverlässig aktualisiert werden kann)
  4. Testen Sie, ob Intellisense funktioniert, indem Sie z. B. Folgendes eingeben: sin( und prüfen, ob Argumentationshilfe auftaucht.Manchmal funktionierte das, die Mitgliederhilfe jedoch nicht – also versuchen Sie es auch.
  5. Erstellen Sie eine Instanz von etwas in der Header-Datei, erstellen Sie sie und prüfen Sie, ob IS dadurch beendet wird.
  6. Entfernen Sie den Code aus der Täterdatei und fahren Sie mit Schritt 3 fort
  7. Nachdem Sie problematischen Code gefunden und behoben haben, setzen Sie den in Schritt 5 entfernten Code zurück und versuchen Sie es erneut
  8. Nachdem Sie dafür gesorgt haben, dass eine ganze Klasse gut funktioniert, erstellen Sie eine Instanz der nächsten Klasse und so weiter ...

Ich fand es auf diese Weise einfach, die Codestellen zu lokalisieren, die Probleme verursachten (mir ist klar, dass dies bei wirklich großen Projekten möglicherweise nicht durchführbar ist, in meinem Fall verursachte nur eine einzige Datei von 97 Problemen).Beachten Sie, dass sich „Build“ hier auf das Kompilieren bezieht. Die Verknüpfungsphase muss nicht abgeschlossen sein. Nicht aufgelöste externe Elemente sind also in Ordnung. Der IS sollte trotzdem aktualisiert werden.

Eine andere Methode zum Aktualisieren von IS (außer dem Erstellen) besteht darin, alles zu speichern, den Arbeitsbereich zu schließen, die .ncb-Datei zu löschen und sie erneut zu öffnen.Warten Sie dann auf „Aktualisierung von Intellisense ...“(N)‘ verschwindet aus der Statusleiste (N zählt gegen Null, wenn es nicht ganz reicht, zeigt es sozusagen den Fortschritt an, bei dem Probleme aufgetreten sind).Ich fand das ziemlich langweilig.

Zu diesem Problem ist mir etwas Interessantes aufgefallen (auf Visual Studio 2010):Um dieses Problem zu lösen, habe ich mich geändert #include sintax in meinen Header-Dateien, vorher war (altes Projekt mit VS 2005 erstellt und mit VS 2010 erneut geöffnet):

#include <myfile.h> 

und ich behebe das mit:

#include "myfile.h"

Nachdem Intellisense ordnungsgemäß funktioniert!Ich hoffe, das kann helfen!

Ich musste die Einstellungen zurücksetzen...

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

Thread dazu hier

Das Problem liegt bei den .vcproj-Dateien.

Sie werden feststellen, dass es oft funktioniert, wenn Sie vom Debug-Modus in den Release-Modus wechseln, erstellen und dann Intellisense ausprobieren.

Schließen Sie Visual Studio.Wenn Sie in Ihrem Projekt nach den .vcproj-Dateien suchen, bearbeiten Sie diese und suchen Sie nach den ersten beiden Instanzen von AdditionalIncludeDirectories.Der Wert hierfür sollte etwa wie „..\,....\“ und nicht wie „../..“ aussehen.

Öffnen Sie Ihr Projekt erneut, lassen Sie Intellisense den Aufbau abschließen, dann sollte das Problem behoben sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top