Woher weiß GCC, in welcher Zeile ein Fehler liegt, wenn der Compiler alle Leerzeichen und Kommentare aus dem Code entfernt?

8

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%     
Nick Sweeting 09.10.2013, 13:15
quelle

2 Antworten

3

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

%Vor%

(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.

    
Mike Seymour 09.10.2013, 13:27
quelle
8

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.

    
James Kanze 09.10.2013 13:25
quelle

Tags und Links