C++ Builder Echtzeit Code-Analyse ?



  • hallo

    ich suche tools oder einstellungen, damit der C++ Builder in echtzeit den geschriebenen code analysiert und fehler markiert und meldet.

    ich bin noch recht neu bei c++ und habe vorher mit dem borland developer studio und delphi gearbeitet. da gab es dieses feature. noch wahrend man schrieb wirden unbekannte bezeichner rot unterstrichen oder syntaxfehlerunter meldungen notiert.
    das ersparte eine menge sucherei/scrollerei.

    bei c++ builder erkennt er fehler erst beim kompilieren.
    gibt es da optionen die so etwas aktivieren oder plugins/tools die sowas machen ?
    stichwort code highlighting ?

    grüße g1o2k4



  • Nein, das gibt es nicht. Für Delphi wird das über .NET mittels eines Code-DOM realisiert, allerdings ist C++ im Gegensatz zu Delphi, C# und Java so schwer zu parsen, daß praktisch jedes Tool außer dem Compiler selbst früher oder später scheitert. Für so etwas wie eine Strukturansicht ist das nicht allzu relevant, aber für eine Fehleranzeige bedarf es einer detaillierten Analyse des Codes, und die kann nur der Compiler liefern. Und wenn der ständig nebenher deinen Code parsen würde, könntest du vermutlich nicht mehr vernünftig arbeiten 😉

    Das heißt übrigens nicht "Code Highlighting", sondern "Error Insight" (zumindest bei Delphi).



  • ein grund mehr mehr einen c++ nachfolger zu veröffentlichen. bzw ein neues system in c++0x implementieren



  • Ein C++ Nachfolger wird höchstens nur noch komplexer wodurch das Problem eher verschärft wird.



  • ich finde man sollte auch mal kürzen können statt immer nur neue features hinzuzufügen. - alten compiler weg neuen hinzu.
    und was ist so schwer in den header dateien nach ner funktion zu suchen und anzuzeigen wenn sie nicht da ist, dann behebt man wenigstens schonmal rechtschreibfehler.



  • g1o2k4 schrieb:

    und was ist so schwer in den header dateien nach ner funktion zu suchen und anzuzeigen wenn sie nicht da ist[...]

    Na mach doch, der BCB ist über die OpenTools-API erweiterbar.



  • Braunstein schrieb:

    Ein C++ Nachfolger wird höchstens nur noch komplexer wodurch das Problem eher verschärft wird.

    Es wird durchaus auch Komplexität reduziert. Z.B. mit dem constexpr-Keyword, das so manche Trickserei mit Template-Metaprogrammierung überflüssig macht, oder mit auto und decltype, die dir in Fällen wie dem folgenden viel Tipparbeit abnehmen:

    std::list <std::vector <MyClass, MyAllocator <MyClass> > > list;
    std::list <std::vector <MyClass, MyAllocator <MyClass> > >::iterator i = list.begin (); // alt
    auto i = list.begin (); // neu
    

    g1o2k4 schrieb:

    ich finde man sollte auch mal kürzen können statt immer nur neue features hinzuzufügen.

    Wenn du das willst, wechsle die Sprache. C# z.B. ist eine solche Sprache, die ohne Altlasten auskommt. C++ hingegen war von vorneherein auf Abwärtskompatibilität zu C ausgelegt. Würde eine neuere Revision der Sprache Kompatibilität zu bisherigem Code brechen, würde keiner sie implementieren oder verwenden, so einfach ist das.

    g1o2k4 schrieb:

    alten compiler weg neuen hinzu.

    Soll das ein Witz sein? Weißt du, wie viel Arbeit hinter den marktrelevanten C++-Compilern steckt? Wie alt die Code-Bases teilweise sind?
    Selbst Microsoft kann es sich nicht leisten, seinen C++-Compiler von Grund auf neu zu entwerfen, nicht einmal, das ABI zu ändern (auch wenn es an der Zeit wäre).

    g1o2k4 schrieb:

    und was ist so schwer in den header dateien nach ner funktion zu suchen und anzuzeigen

    Das zeige ich dir gerne.

    template <typename T,
              typename Base,
              int direction = UCL_ITERWRAP_FORWARD,
              typename iter = T*>
        class RandomIterator
            : public BiDiIterator <T, Base, direction, iter, std::random_access_iterator_tag>
    {
        typedef std::iterator <std::random_access_iterator_tag, T> _iterBase;
        typedef BiDiIterator <T, Base, direction, iter> _iterBase2;
    private:
        struct _some_struct_t {};
    
        typedef typename IfThenElseType <TypesAreEqual <T, const T>::result,
            RandomIterator <const T, Base, direction, iter>,
            _some_struct_t>::type
                const_iterator_type;
        typedef RandomIterator iterator_type;
    
    public:
        typedef size_t size_type;
       ...
    };
    

    Bau einen Parser, der
    a) durch die Typdeklarationen hier noch durchsteigt,
    b) den Code verifiziert, und
    c) in Echtzeit lauffähig ist, so daß er nicht übermäßig CPU verschwendet.
    Dann reden wir weiter.

    In der Praxis ist das, da für das Parsen von C++ mehrere Durchgänge notwendig sind, praktisch unmöglich. Der Compiler ist zwar durchaus in der Lage, in akzeptabler Zeit durch ein derartiges Templategestrüpp durchzusteigen und dir die Member einer solchen Klasse anzuzeigen (Code Insight). Die Überprüfung auf Fehler allerdings ist durch verzögerte Template-Instantiierung, Vorwärtsdeklarationen etc. ein weitaus schwierigeres Unterfangen - dafür gibt die aktuelle Hardware einfach noch nicht genug her.



  • Wenn man keine Ahnung hat, einfach mal die Fr*sse halten! 😃


Anmelden zum Antworten