2016-07-31 4 views
-3

Warum haben C++ - Compiler (und Compiler für andere Programmiersprachen im Allgemeinen) eher obskure Fehlermeldungen? Ist es vielleicht Geschichte basiert? Faulheit? Oder ist es einfach zu schwer, Fehlermeldungen für alle verständlich zu machen?Warum haben C++ - Compiler obskure Fehlermeldungen

Die aus Vorlagenfehlern erzeugten Fehlermeldungen können eher lästig/einschüchternd sein. Darüber hinaus können die Fehlermeldungen Abkürzungen verwenden, die nicht intuitiv sind, z. B. “ statische Elementfunktion kann kein cv-Qualifikationsmerkmal haben. ” Ich glaube, die “ cv ” steht für konstant/volatil.

+2

Illustrieren - die modernen Compiler produzieren im Allgemeinen ziemlich gute und explizite Fehlermeldungen. Sie nehmen an, dass Sie die Sprache, die Sie schreiben, kennen, aber das ist alles. Was "cv-qualifier" betrifft, ist dies ein technischer Begriff der Sprache, die vom C++ - Standard verwendet wird (z. B. §3.9.3 CV-Qualifier [basic.type.qualifier] im Standard 2011). Ja, es bedeutet "konstante oder volatile Qualifier". –

+0

Es spielt keine Rolle. Während der Vorlagenfehler eine Textwand erzeugt, ist die einzige wichtige Sache die fehlerhafte Zeilennummer des ersten Fehlers, ich achte nie darauf, was es sagt. –

+2

C++ hat keine Fehlermeldungen. Compiler-Implementierungen haben Fehlermeldungen. Ihre Frage sollte daher an die jeweiligen Implementierer gerichtet werden. – EJP

Antwort

10

Erstens ist es nicht C++, die Ihnen Fehlermeldungen gibt; Es ist dein Compiler. Das mag akademisch klingen, aber es ist eine wichtige Unterscheidung. Nicht, dass es sich wirklich auf Ihre Frage auswirkt, da die Compiler-Diagnose in Mainstream-Implementierungen ziemlich komplex ist.

Es ist nicht wegen Faulheit und es ist nicht historisch; es ist eine Kombination dieser Faktoren:

  • ein Wunsch präziser

    Es ist nicht gut Verdummung für ein paar Neulinge zu sein, wenn das bedeutet, dass die echten Profis nicht bekommen Informationen, die sie nutzen können. In Ihrem Beispiel ist "cv-qualifier" genau und präzise und sagt Ihnen, was vor sich geht. Du könntest eine andere Möglichkeit finden, es zu beschreiben, aber das würde entweder nicht dem entsprechen, was in der von dir verwendeten Sprache vor sich geht, oder es wäre falsch.

  • Implementierungskomplexität

    Okay, Template-Diagnose um fair zu sein, schrecklich sein kann. Es gab Bemühungen, dies in neueren GCC-Versionen, in Clang und mit Tools wie STLFilt zu verbessern. Aber letztendlich ist das schwer zu erreichen. Es ist wirklich sehr schwierig. Fühlen Sie sich frei, einen Patch an Ihre bevorzugte Implementierung zu senden, wenn Sie denken, dass Sie einen besseren Job machen können. :)

  • Sprache Komplexität

    C++ ist sehr komplex. Das ist seine Natur. Es ist sehr mächtig, viel mehr als eine kleine Skriptsprache oder eine andere Sprache, die Ihnen schönere Nachrichten gibt. Man könnte argumentieren, dass seine Konstruktion ist auch Komplex, und das ist eine häufige Kritik an der Sprache. Man könnte sagen, dass die für komplexe, präzise Diagnosen daraus zumindest teilweise stammt.

  • Unfähigkeit Geist auszuführen

    Dies ist eine Variation des ersten Faktors zu lesen. Um einen einfacheren Satz von Fehlernachrichten zu erzeugen, müsste der Compiler wissen, was Sie stattdessen schreiben wollten, wenn Ihr Code kaputt ist. Das ist ohne Gedankenlesen nicht möglich. Der Compiler kann versuchen, etwas zu erraten, aber das Risiko besteht darin, dass es falsch rät. Tatsächlich ist dieses Risiko in einer Sprache, die so komplex wie C++ ist, ziemlich hoch.Daher ziehen wir es vor, dass der Compiler nur direkt mit uns zusammenarbeitet, und wir trainieren dann unser Gehirn, um eine Mustervergleichsdiagnose mit dem Code, den wir geschrieben haben, zu erstellen. Ein professioneller C++ Entwickler kann die Ursache einer bestimmten Fehlermeldung (ausgelöst durch einen bestimmten Code) in der Regel innerhalb von Sekunden erkennen. auch wenn diese Fehlermeldung zufällig von der Art ist, die auf der Oberfläche davon völlig nutzlos ist. Das ist die Magie unseres Handwerks!

+0

* Simplifizierer der Fehlermeldung * existieren, z. alt [stlfilt] (http://www.bdsoft.com/tools/stlfilt.html). Idealerweise sollten Compiler dies tun, und unter Verwendung ihrer detaillierteren Kenntnis des Quellcodes können sie Dinge benennen, z. wie Where-Klauseln in der funktionalen Programmierung. Ich denke, der Hauptgrund dafür liegt in den begrenzten Ressourcen für Management und Entwicklung. Zum Beispiel gibt g ++ die zugehörigen Informationen für eine Fehlermeldung als Folgezeilen aus, die, wie ich mich erinnere, unterdrückt werden, wenn Sie beim ersten Fehler anhalten, und das ist ein Mangel an Qualität, der leicht hätte behoben werden können, wenn. –

+0

Ich verstehe Ihre Punkte. Genau zu sein ist in Ordnung, aber ich mag einfach nicht die Verwendung von nicht-intuitiven Abkürzungen im Allgemeinen. Die Erweiterung von cv-Qualifiern auf konstante/volatile Qualifier erreicht ungefähr den gleichen Zweck –

+0

@ J-Win: "cv-qualifier" ist nicht nur der genau richtige Begriff (wörtlich aus dem Standard genommen), sondern ist für C++ - Entwickler sehr intuitiv Sie wissen, was es bedeutet. Wer es nicht braucht, muss es nur einmal nachschlagen. Wenn man es jedes Mal vollständig ausschreibt, würden die Nachrichten weniger technisch korrekt, _mehr_ ärgerlich, ausführlich und damit letztlich _los_ nützlich. –