Was bedeuten die Zahlen in den vorverarbeiteten .i-Dateien beim Kompilieren von C mit gcc?

Lesezeit: 2 Minuten

Benutzer-Avatar
Conan

Ich versuche, den Kompilierungsprozess zu verstehen. Wir können die Präprozessor-Zwischendatei sehen, indem wir Folgendes verwenden:

gcc -E hello.c -o hello.i

oder

cpp hello.c > hello.i

Ich weiß ungefähr, was der Präprozessor tut, aber ich habe Schwierigkeiten, die Zahlen in einigen Zeilen zu verstehen. Zum Beispiel:

 # 1 "/usr/include/stdc-predef.h" 1 3 4
 # 1 "<command-line>" 2
 # 1 "hello.c"
 # 1 "/usr/include/stdio.h" 1 3 4
 # 27 "/usr/include/stdio.h" 3 4
 # 1 "/usr/include/features.h" 1 3 4
 # 374 "/usr/include/features.h" 3 4

Die Zahlen können dem Debugger helfen, die Zeilennummern anzuzeigen. Meine Vermutung für die erste Spalte ist also die Zeilennummer für die Datei Spalte Nr. 2. Aber was machen die folgenden Zahlen?

  • Mögliches Duplikat von Was bedeuten Zeilen, die mit einem Hash-Zeichen und einer Zahl wie ‘# 1 “ac”‘ in der Ausgabe des gcc-Präprozessors beginnen?

    – jww

    28. Februar 2017 um 2:41 Uhr

Benutzer-Avatar
dbusch

Die Zahlen nach dem Dateinamen sind Flags:

1: Dies zeigt den Beginn einer neuen Datei an.

2: Dies zeigt die Rückkehr zu einer Datei an (nachdem eine andere Datei eingefügt wurde).

3: Dies zeigt an, dass der folgende Text aus einer System-Header-Datei stammt, daher sollten bestimmte Warnungen unterdrückt werden.

4: Dies zeigt an, dass der folgende Text so behandelt werden sollte, als wäre er in ein Implizit eingeschlossen extern "C" Block.

Quelle: https://gcc.gnu.org/onlinedocs/cpp/Preprocessor-Output.html

  • Vielen Dank. Es sind sehr nützliche Informationen. Ich versuche immer noch zu verstehen, wie diese in das Bild passen. Kannst du das ein bisschen erklären? Ich werde auch meine Recherchen basierend auf Ihrer Quelle fortsetzen und sehen, wie diese Flags interpretiert wurden.

    – Conan

    12. Oktober 2015 um 21:05 Uhr

  • Ich glaube, die Flags 1 und 2 sollen eine Vorstellung von der Verschachtelung der Include-Dateien vermitteln, sodass klar ist, wer wen eingebunden hat. Systemheader können Konstrukte enthalten, die nicht dem Standard entsprechen, sodass das 3-Flag dem Compiler mitteilt, dass diese Konstrukte in diesem Kontext akzeptabel sind. Und da Header-Dateien sowohl von C- als auch von C++-Quellen eingebunden werden können, teilt das 4-Flag dem C++-Compiler mit, dass er keine Namensverstümmelung durchführen soll.

    – dbusch

    12. Oktober 2015 um 21:13 Uhr

  • Neuere Versionen von gcc können die “verschachtelte Natur” verwenden, um die Abfolge von Include-Dateien anzuzeigen, wo ein Problem liegt. Ob das sinnvoll ist, ist fraglich, da die neueren Versionen keine neuere Type-Checking oder bessere Analyse bieten und dadurch bestehende kleine Probleme einfach vergrößern.

    – Thomas Dickey

    12. Oktober 2015 um 22:03 Uhr

  • An dieser Stelle kann ich mangels Wissen nicht viel verdauen. Werde mein Studium fortsetzen. Danke Leute.

    – Conan

    13. Oktober 2015 um 1:36 Uhr

1373200cookie-checkWas bedeuten die Zahlen in den vorverarbeiteten .i-Dateien beim Kompilieren von C mit gcc?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy