Codegear C++ Builder - Autovervollständigung



  • Hey hey Gemeinde,
    bin grad dabei an einem Projekt zu arbeiten und verwende hin und wieder die auto(code)vervollständigung um z.b. methoden von klassen aufzurufen.
    Aber seit eben, geht das einfach nicht mehr.
    Ich hasse diesen sch*** C++ Builder dafür, habe aber derzeit nichts anderes zur Hand.
    Wie kann es sein, dass die Auto-Vervollständigung vor ein paar Minuten noch ging und nun nicht mehr. Der Code ist fehlerfrei (syntaktisch). Compiler gibt keine Fehlermeldung dennoch will die Auto-Dingens nicht aufpoppen, wenn ich STRG+SPACE drücke.

    WARUM NUR ???



  • Jaaa... diese Erfahrung habe ich auch schon gemacht. Speziell beim BCB 5 hat mal bei einem Projekt einfach irgendwann die Code Vervollständigung überhaupt nichtmehr getan. Neues Projekt gemacht, alles übernommen und es ging wieder. Beim 2007er habe ich ähnliche Dinge erlebt, allerdings waren die immer nur temporär und sind "irgendwann" wieder gelaufen. Ich zumindest habe nie eine Lösung gefunden, vermutlich ist das Ding einfach verbuggt.



  • Das ist furchtbar!



  • Quellcode schrieb:

    Das ist furchtbar!

    Codelite hat ein richtig gutes Intellisense. Den Compiler kann man einstellen :).
    rya.



  • versteh leider nur Bahnhof,

    hab soviel rausgefunden, dass die Auto-Vervollständigung in Headern nicht funzt.



  • Quellcode schrieb:

    Wie kann es sein, dass die Auto-Vervollständigung vor ein paar Minuten noch ging und nun nicht mehr. Der Code ist fehlerfrei (syntaktisch). Compiler gibt keine Fehlermeldung dennoch will die Auto-Dingens nicht aufpoppen, wenn ich STRG+SPACE drücke.

    WARUM NUR ???

    Welche C++Builder-Version?

    Ein wenig Hintergrund zu Code Completion:
    Während IntelliSense in VS einen eigenen Parser und eine Symboldatenbank benutzt, greift Code Completion in C++Builder auf den Compiler zurück. Der Compiler hat einen speziellen "Kibitz"-Modus, in dem er die Implemenationen von Funktionen überspringt und keinen Code generiert. Wird Code Completion (Ctrg+Space), Parameter Insight (Ctrl+Shift+Space) oder Code Browsing (Ctrl+Click) angefordert, so startet die IDE die DLL-Version des Compilers (comp32x.dll) im Kibitz-Modus; der Compiler parst das aktive Modul bis zur Cursorposition und stellt dann seine Symboltabelle bereit.

    Nachteile dieses Ansatzes sind:
    - Der Compiler kann nur Übersetzungseinheiten übersetzen, also *.c- und *.cpp-Dateien. Code Completion funktioniert daher nicht in Headerdateien.
    - Alle Headerdateien, die von einer Datei eingebunden werden, werden vom Compiler geparst. Daher wird Code Completion mit steigender Zahl der Quelltextzeilen spürbar langsamer.
    - Sobald der Code Syntaxfehler enthält, funktioniert Code Completion ab der Fehlerposition nicht mehr.
    - Vermutlich infolge der schieren Größe der Symboltabelle im globalen Namespace (manchmal aber auch wegen des in QC #56601 beschriebenen Bugs) verweigert Code Completion manchmal den Dienst, wenn es am Anfang einer Anweisung, also ohne Kontext aufgerufen wird. Das Anzeigen der Member einer Klasse oder eines Objektes funktioniert jedoch eigentlich immer.

    Allerdings hat diese Implementation auch einen gewaltigen Vorteil, nämlich die Genauigkeit. Code Completion greift auf denselben Compiler zurück, der auch die reale Übersetzung des Codes durchführt, und ist daher deutlich akkurater als auf einem separaten Parser basierende Ansätze. Tatsächlich schien dieser Vorteil auch Microsoft so deutlich zu sein, daß zukünftige Versionen von Visual C++ ebenfalls diesem Ansatz folgen werden.

    Trotz obengenannter Nachteile kann man, sofern man einige Vorbereitungen trifft, mit Code Completion ganz hervorragend arbeiten. Zunächst ist es sinnvoll, gegenseitige Abhängigkeiten von Headerdateien zu minimieren und den Code klar in kleine Module sowie in UI und Business-Logik zu unterteilen (ggf. darüber hinaus auch MVC). Weiter sollte der PCH-Mechanismus (precompiled headers) richtig eingesetzt werden. Wenn ein PCH vorhanden ist, greift der Compiler auch im Kibitz-Modus auf diesen zurück; dementsprechend sollte für das Projekt ein PCH erstellt werden, der alle externen Headerdateien einschließt. Über die entsprechende Funktionalität verfügt BCC bereits seit Urzeiten (PCH seit Borland C++ 3 oder 4, externe Typdateien seit v5.2/C++Builder 1), aber C++Builder 1 bis 2006 waren standardmäßig so konfiguriert, daß sie einen globalen PCH verwendeten, der die meisten VCL-Header enthielt. Das hatte zur Folge, daß einerseits Code Completion in einer neu erstellten VCL-Anwendung praktisch unverzögert zur Verfügung stand, andererseits aber die Übersetzungszeiten mit wachsender Projektkomplexität deutlich zunahmen. Seit C++Builder 2007 werden PCHs standardmäßig pro Projekt angelegt, und das zuerst kompilierte Modul entscheidet über deren Inhalt. In C++Builder 2009 kam der PCH-Wizard hinzu, der in der Lage ist, für das Projekt automatisch einen Master-Header zusammenzustellen.

    Ein kleines Beispiel: eine Anwendung, an der ich gerade arbeite, besteht aus derzeit 24 Modulen und benötigt ohne PCH 42s für die Übersetzung (Clean/Build); der Compiler berichtet insgesamt 17779660 übersetzte Codezeilen (was natürlich sämtliche Header-Duplikationen enthält). Nach dem Einsatz des PCH-Wizard reduzierte sich die Clean/Build-Zeit auf 10s (886500 Zeilen). Danach stand Code Completion mit Verzögerungen zwischen 0.3 und 0.5s in jeder Übersetzungseinheit zur Verfügung.



  • wow danke, jetzt bin ich schlauer 🙂



  • ich habe ein source code und ein andere code die muss ich ich integrierren


Anmelden zum Antworten