2009-08-02 3 views
4

Hier ist ein Code ein lästiges Problem zu demonstrieren:Eclipse-C++ Kompilierung Warnung Problem

class A { 
public: 
    A(): 
     m_b(1), 
     m_a(2) 
     {} 
private: 
    int m_a; 
    int m_b; 
}; 

Dies ist eine Ausgabe auf Console Ansicht:

make all 
Building file: ../test.cpp 
Invoking: GCC C++ Compiler 
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"test.d" -MT"test.d" -o"test.o" "../test.cpp" 
../test.cpp: In constructor 'A::A()': 
../test.cpp:9: warning: 'A::m_b' will be initialized after 
../test.cpp:8: warning: 'int A::m_a' 
../test.cpp:3: warning: when initialized here 
Finished building: ../test.cpp 

Das Problem ist, dass in Probleme Ansicht Ich sehe 3 separate Warnungen (Zeilen in der Ausgabe, die ein Warnwort enthalten), während tatsächlich 4 Zeilen in der Ausgabe ein Problem beschreiben.

Gibt es etwas, das mir fehlt?

Zusätzliche Frage. Vielleicht ist es in Eclipse Geist, aber ist es eine Möglichkeit, Console Ansicht klickbare wie die meisten IDE tut (zB Visual Studio, Emacs ...)

Dank Dima

+0

Ich bin ein wenig überrascht, dass die Konsole in CDT nicht anklickbar ist, wie es für Java ist, denke, dass sie noch nicht dazu gekommen sind. Ich habe Eclipse mit CDT gerade nicht installiert, also kann ich nicht überprüfen, aber zumindest könnte man ein Plug-in schreiben, um das Problem zu lösen. – NomeN

Antwort

1

Nach dem letzten Kommentar auf this Fehlerbericht Sie sollten in der Lage sein, auf die Konsolenansicht zu klicken, um zu Code in CDT 7.0 zu springen.

Es könnte sich lohnen, die Meilenstein-Builds zu überprüfen, um zu sehen, ob die Gruppierung von Fehlermeldungen besser ist. Es wäre eine gute Idee, wenn ein Fehler nicht ausgelöst würde, um damit verbundene Nachrichten zu gruppieren.

+0

Ich werde es überprüfen. Ich benutze CDT 6.x, während es bereits gibt Release ca ndidate von CDT 7.x, wie Sie bereits erwähnt haben. – dimba

+0

Kürzlich sind wir zu CDT 7.0 gewechselt - die Konsolenansicht ist in der Tat klickbar. Zu guter Letzt!!!!! – dimba

6

Es gibt mehrere Zeilen in der Warnung zu machen weil jede Zeile auf eine andere Codezeile verweist. Das Problem gewarnt über das, was ist zum m_b geschieht, die in Zeile 9 deklariert ist, ist es weil der Tatsache, dass m_a auf Linie 8 vor deklariert m_b ist, aber es ist verursacht durch das, was in Ihrer Initialisiererliste passiert, die in Zeile 3 beginnt.

Mit gcc ist es möglich, dass Warnungen, die nicht miteinander verwandt sind, nacheinander angezeigt werden (dh eine Menge nicht zusammenhängender Dinge sind falsch in main), also kann Eclipse nicht sagen aus der Ausgabe, ob diese separate Warnungen oder alle auf das gleiche Problem bezogen sind.

+0

Aber die Linien sind in der Tat verwandt. Jede einzelne Warnzeile gibt keinen Hinweis darauf, was das Problem ist. Zum Beispiel Zeile "../test.cpp:3: Warnung: wenn hier initialisiert" - selbst ist die Zeile nicht sinnvoll, da sie nicht im Zusammenhang steht. Auch Zeile "../test.cpp: Im Konstruktor 'A :: A()':" was Teil des Problems ist, erscheint überhaupt nicht in der "Probleme" -Ansicht – dimba

+1

Ich denke auch, dass der CDT-Fehler Parser sein könnte geschickter und sehen Sie die Beziehung (extrahiert durch die Einrückung der Warnmeldungen nach "Warnung:"). Es kann aber auch ein Problem sein, die damit verbundenen Fehler in der Eclipse-IDE zu visualisieren (die ursprünglich entwickelt wurde, um Java-Programme zu entwickeln, die keine ähnlichen Fehler aufweisen [ich weiß nicht]). Ich finde es auch schwierig, diese verwandten Fehler in Eclipse zu verfolgen ... – mmmmmmmm

+0

idimba, vielleicht war meine obige Formulierung unklar. Diese drei Zeilen, die nacheinander erscheinen, sind verwandt; Es ist auch möglich, dass nicht zusammenhängende Warnungen nacheinander angezeigt werden, sodass Eclipse den Unterschied nicht erkennen kann und davon ausgeht, dass es sich um separate Warnungen handelt. Da die Zeile "In constructor ..." nicht angezeigt wird, sucht der Fehlerparser wahrscheinlich nicht nach diesem Muster. –

0

Felder werden in der Reihenfolge initialisiert, in der sie in der Klasse deklariert sind. Der Compiler hilft Ihnen, indem er Ihnen mitteilt, dass der Konstruktor sich in der falschen Reihenfolge initialisiert. Dies kann seltsame Fehler verursachen, wenn die Reihenfolge der Initialisierung wichtig ist.

+0

Die Frage war nicht "Warum bekomme ich diese Compiler-Warnung?"Die Frage lautete:" Warum zeigt Eclipse mir die Compiler-Warnung auf diese spezielle Art? " – MatrixFrog

0

Danke David, aber ich denke, Sie haben mich missverstanden. Ich habe mich auf die Tatsache bezogen, dass die Ansicht "Probleme" in Eclipse die Compilerfehler standardmäßig alphabetisch sortiert. Als Dima sagte verursacht dieses Problem mit gcc Fehlermeldungen, die über zwei Zeilen verteilt sind, wie

  1. Fehler: ‚so und so‘ geschützt ist
  2. in diesem Zusammenhang

als alle " In diesem Kontext werden Zeilen von der Variablen getrennt, auf die sie sich beziehen.

ABER, ich habe gerade die Option gefunden, die Sortierreihenfolge der Compilerfehler zu ändern, das kleine nach unten weisende Dreieck am oberen Rand der Ansicht (nur gerade ausgearbeitet, wo Sie die Optionen für die Ansicht einstellen wie ich bin neu zu eclipse). Wenn Sie damit spielen, wird es helfen, aber wird immer noch nicht in der Lage sein zu stoppen Fehler in der gleichen Datei (warum gibt es keine Möglichkeit, sie so zu lassen, wie sie waren?)

+2

Ich habe ein wenig mehr Nachforschungen angestellt, und Sie haben Recht, Sortierung vor Ort entfernt die Sortierung nach Datei und Sortierung nach Datei entstellt den Ort sort ... doof In den Einstellungen der Ansicht gibt es jedoch ein Feld "Erstellungszeit", das standardmäßig ausgeblendet ist. Wenn dieses Feld sichtbar gemacht und sortiert wird, werden die Probleme nach der Zeit sortiert, zu der sie beim Kompilieren aufgetreten sind also auch pro Datei.Ein Vorbehalt, Probleme aus älteren Kompilationen werden möglicherweise nicht mit den Problemen von neueren Kompilationen aufgelistet. Aber das wird kein Problem sein, wenn Sie ordentlich arbeiten und alle Probleme vor dem erneuten Kompilieren entfernen. – NomeN

+0

@NomeN wenn das eine Antwort ist auf die ursprüngliche Frage (was es klingt wie es ist) dann posten Sie es als eine Antwort, kein Kommentar. – MatrixFrog

0

Ich nehme an, es ist, weil CDT noch ein bisschen unreif ist und wahrscheinlich g ++ Ausgabe auf die bestmögliche Weise nicht analysieren kann. Die Zeile ../test.cpp: In constructor 'A::A()': enthält keine Zeilennummer, daher kann CDT keine Fehlermarkierung in test.cpp Editor platzieren und wahrscheinlich betrifft dieses Problem Probleme Ansicht.

Es gibt mehr Probleme mit Probleme Ansicht. Zum Beispiel können Sie nur sichtbare Fehler aus der Ansicht löschen. Wenn Sie also mehr als 100 Standardelemente erhalten, müssen Sie sie nacheinander hundert Mal löschen. Auch Fehler werden nach dem Bereinigen nicht automatisch entfernt, wenn ein Fehler in der unabhängigen Headerdatei aufgetreten ist. Sei nur nachsichtig, sie verbessern CDT von der Veröffentlichung bis zur Veröffentlichung.

Zusätzliche Frage - Was meinen Sie mit "Console View klickbar machen"?

+0

Es gibt eine "Ansicht" ruft Console, wo Sie die Ausgabe der Make-Datei sehen. – dimba

+0

Aber was bedeutet "anklickbar"? – doc