Alternativen zu gcc/g++ unter Linux?
-
Der gcc 4.1 ist eigentlich sehr standardkonform. Der MSVC++ 8.0 aber auch. In den meisten Fällen sind die Versionen schuld, wenn der Compiler zu lasch ist.
Zeig doch mal ein Codebeispiel und eine Meldung, von der Du meinst, sie sollte nicht auftreten.
-
Ich weiß ohne Beispiel ist es sehr schwer Fehler zu finden, aber wenn ich hier Teile des Codes poste bin ich ein toter Mann *g*
Aber ich kann mal schematisch posten wie der Code aussieht. Das ganze dreht sich um Templates:
template<typename X, typename Allocator> class A { public: typedef Allocator allocator_type; typedef typename Allocator::pointer pointer; typedef typename Allocator::size_type size_type; protected: pointer m_data; size_type m_size; Allocator m_alloc; A(const A<X, Allocator>& other) { m_data = m_alloc.allocate(m_size, NULL); //hier ist der Fehler } };
g++ meint nun:
"instantiated from A<X, Allocator>::A(const A<X, Allocator>&) [with T= unsigned char, Allocator=...]"Ich hoffe die "..." am Ende sind nicht zu wichtig, aber da gehts wieder recht ins Detail (ihr wisst schon, toter Mann und so
). So bei näherer Betrachtung liegt der Fehler wohl eher in der Benutzung dieser Klasse als in der Implementierung und der Compiler schmeißt mir hier wieder die total falsche Zeile an den Kopf (der Fehler ist ganz wo anders) oder?
Ist es denn echt so schwer C++ Programm so zu kompilieren dass Fehlermeldungen auch passend ausgegeben werden?
-
BugJoe schrieb:
g++ meint nun:
"instantiated from A<X, Allocator>::A(const A<X, Allocator>&) [with T= unsigned char, Allocator=...]"Ich hoffe die "..." am Ende sind nicht zu wichtig, aber da gehts wieder recht ins Detail (ihr wisst schon, toter Mann und so
). So bei näherer Betrachtung liegt der Fehler wohl eher in der Benutzung dieser Klasse als in der Implementierung und der Compiler schmeißt mir hier wieder die total falsche Zeile an den Kopf (der Fehler ist ganz wo anders) oder?
Ist es denn echt so schwer C++ Programm so zu kompilieren dass Fehlermeldungen auch passend ausgegeben werden?
Wenn Du wenigstens die Fehlermeldung gepostet hättest
Diese Zeile besagt nur, von wo aus der fehlerhafte Code instanziert wurde. Die tatsächliche Fehlermeldung (mit passender Zeilenangabe) findest Du ein paar Zeilen weiter.
-
Genau das meinte ich mit
Ist es denn echt so schwer C++ Programm so zu kompilieren dass Fehlermeldungen auch passend ausgegeben werden?
Es ist nämlich leider nicht so dass er mir netteweise sagt wo denn der Ursprung des Fehlers ist. Ich mag C++ bzw. die verfügbaren Compiler nicht
Mal gucken, bin gerade auf einer wilden Verfolgungsjagt durch die Tiefen des Quellcodes um den Fehler zu lokalisieren. Wenn ich erfolgreich war sag ich bescheid und dann können wir alle über die Sinnlosigkeit solcher Compilerfehlermeldungen lachen
-
BugJoe schrieb:
Genau das meinte ich mit
Ist es denn echt so schwer C++ Programm so zu kompilieren dass Fehlermeldungen auch passend ausgegeben werden?
Es ist nämlich leider nicht so dass er mir netteweise sagt wo denn der Ursprung des Fehlers ist. Ich mag C++ bzw. die verfügbaren Compiler nicht
Mal gucken, bin gerade auf einer wilden Verfolgungsjagt durch die Tiefen des Quellcodes um den Fehler zu lokalisieren. Wenn ich erfolgreich war sag ich bescheid und dann können wir alle über die Sinnlosigkeit solcher Compilerfehlermeldungen lachen
Paste einfach die ganze Fehlermeldung, dann kann man dir sicherlich helfen. Es ist nicht produktiv die Fehlermeldung mit ... abzukürzen.
-
BugJoe schrieb:
protected: size_type m_size; A(const A<X, Allocator>& other) { m_data = m_alloc.allocate(m_size, NULL); //hier ist der Fehler } };
unabhängig von der fehlermeldung verwendest du m_size uninitialisiert. ich weiß nicht, wie sehr das jetzt wegen der schematischen darstellung passiert oder nicht.
-
OK, erst mal danke für die Hilfe. Der Fehler war ein ganz dummer. Der Source für diesen Projektabschnitt (an dem ich gerade sitze) ist in einem Ordner. Unter Visual Studio sind jedoch zwei getrente Projekte die jeweils einen Teil des Sources benutzen. Das hab ich am Anfang nicht gesehen und unter Linux den gesamten Source versucht zu kompilieren und dabei ist er wohl total durcheinander gekommen.
Also mein spezielles Problem wäre damit zwar gelöst, aber ich bin immer noch offen für eine weiterführende Diskusion: Ist es wirklich nicht möglich dass man für die Sprache C/C++ einen Compiler baut der einem Fehler ausspuckt die auch "normale" Menschen verstehen? Ich meine mein Problem zeigt es ja schon recht deutlich dass streckenweiße Fehlermeldungen produziert werden die nicht mal im Entferntesten mit dem eigentlichen Problem zu tun haben.
-
was verstehts du in diesem kontext als 'normal' ?
mich würde ja immer noch die eigentliche fehlermeldung interessieren.
die hast du uns bislang vorenthalten.
-
die fehlermeldungen von c++-compilern sind eigentlich recht verständlich (sicherlich nicht so einfach wie von delphi oder so). Bloß bei templates kriegen die compiler dann das hacken, da der Fehler bei der benutzung von templates erst im template auftritt und nicht in der aufrufenden stelle. Deshalb gibt ein compiler zB auch einen fehler in std::sort aus, wenn man versucht eine liste zu sortieren.
Das Verhalten soll sich soweit ich weiß im neuen Standard durch die einführung von Concepts deutlich bessern.
-
BugJoe schrieb:
Ist es wirklich nicht möglich dass man für die Sprache C/C++ einen Compiler baut der einem Fehler ausspuckt die auch "normale" Menschen verstehen?
wenn man nicht mit templates herumfummelt, sind die fehlermeldungen eigentlich ganz verständlich.
-
BugJoe schrieb:
...Ist es wirklich nicht möglich dass man für die Sprache C/C++ einen Compiler baut der einem Fehler ausspuckt die auch "normale" Menschen verstehen?...
Ist zwar off-topic, aber ich kann mich hier einfach nicht zurück halten. Es gibt eine Programmiersprache C und eine Programmiersprache C++. Eine Sprache C/C++ gibt es genausowenig wie Java/Perl oder VB/Ruby.
Und jetzt doch noch wieder on-topic.
Das Problem sind tatsächlich die Templates (und damit die Programmiersprache C++). Und man muss nicht damit herumfummeln, wie es fehler-freak sagt, um darunter zu leiden. Die komplette Standardlibrary besteht aus Templates. Dennoch finde ich die Fehlermeldungen von den neueren gcc-Compilern dennoch sehr gut. Sie haben schon das beste daraus gemacht und ich kann in der Regel schon erkennen, was sie bedeuten. C++ ist halt eine großartige Programmiersprache, die einen hilft, wenn man das nötige Know-how hat.
-
Alternative Compiler unter Linux: probier mal den ICC (Intel C++ Compiler) aus, den gibt es für Linux, wenn man nicht kommerziell entwickelt, kostenlos. Den ICC gibts auch für Windows und Mac.
Das der MSC lasch ist, kann man nicht sagen... nicht für aktuelle Versionen! Das sagt selbst Njarne Stroustrup, das der MSC ein sehr ernsthafter C++-Compiler ist. (MSVC6 ist heute einfach kein Argument!).
Zu den Template-Errors: es ist allgemein bekannt, das diese Meldungen Horror sein können. Wenn ich MSVC6 nehme, brauche ich erst garnicht die Fehlermeldung lesen. Bei MSVC7.1 ist es erstaunlich besser geworden. Bei MSVC8 ist es sogar noch verständlicher geworden, da kann ich meistens auf Anhieb den Fehler ausfindig machen. Hier wurde also tatsächlich was verbessert.
Nun, wird es noch eine Steigerung geben? Ja! Mit C++0x wird es die Concepts geben, die Template-Errors noch verständlicher machen werden. Denn mit Concepts kann man als Entwickler endlich sagen, was bei Templates vom User erfüllt werden soll. Was wiederrum dem Compiler bessere Fehlermeldungen ermöglichen kann.
-
Artchi schrieb:
Das sagt selbst Njarne Stroustrup, das der MSC ein sehr ernsthafter C++-Compiler ist.
Wo stand denn das?!