Ich bin mir sicher, dass dies auch für andere Compiler gilt, aber ich habe nur GCC verwendet. Wenn der Compiler den Code optimiert, indem er alles entfernt, was nicht Code ist (Kommentare, Whitespace usw.), wie zeigt er dann richtig an, in welcher Zeile ein Fehler in der Originaldatei ist? Wird der Code nur nach der Überprüfung auf Fehler optimiert? Oder fügt es irgendwie Tags ein, so dass, wenn ein Fehler gefunden wird, er weiß, in welcher Zeile er steht?
%Vor% Der Präprozessor fügt (konzeptionell) #line
Direktiven hinzu, um dem Compiler mitzuteilen, welche Quelldatei und Zeilennummer jeder Zeile der vorverarbeiteten Quelle entspricht. Sie sehen aus wie
(Natürlich ist ein moderner Präprozessor normalerweise kein separates Programm und erzeugt normalerweise keine Zwischentextdarstellung, also handelt es sich tatsächlich um eine Art von Metadaten, die zusammen mit dem Strom vorverarbeiteter Token an den Compiler übergeben werden; es kann einfacher und nicht signifikant falsch sein, in Bezug auf die vorverarbeitete Quelle zu denken.)
Sie können diese selbst hinzufügen, wenn Sie möchten. Mögliche Verwendungen sind das Testen von Makros, die die Definitionen __FILE__
und __LINE__
verwenden, und das Ablegen von Traps für Wartungsprogrammierer.
Der Compiler konvertiert Quellcode in ein Objektformat oder mehr richtig, hier, ein Zwischenformat, das später verwendet wird um das Objektformat zu generieren. Ich habe die Interna nicht untersucht von g ++, aber typischerweise wird ein Compiler die Eingabe und baue eine Baumstruktur. Wenn Sie dies tun, wird es kommentieren Knoten des Baumes mit der Position in der Datei, in der er gelesen wurde das Token, das der Knoten darstellt. Viele Fehler wurden erkannt während dieses Parsing, aber für diejenigen, die nicht sind, die Der Compiler verwendet die Informationen auf dem annotierten Knoten in der Fehlermeldung.
In Bezug auf "Alles entfernen, was nicht ist Code ", das ist wahr in dem Sinne, dass der Compiler die Eingabe und konvertiert sie in den Baum. Aber wenn es so ist, ist es Lesen der Dateien; an jedem Punkt liest es entweder Datei oder Zugriff auf einen Knoten, der mit Anmerkungen versehen wurde, während sich die Datei befand gelesen werden.
Tags und Links c++ compiler-errors g++