Was heißt eigentlich # 2 "main.c" 2
-
Nachdem meine Quellen durch den Präprozessor gelaufen sind, stehen drinnen einige Zeilen nach folgendem Schema (g++):
# 2 "main.c" 2 // oder auch #pragma pack(push,1)
Ich bin noch am Suchen... vielleicht weiß ja jemand, was das bedeutet, und kann's mir erklären.
-
Das dürften Zeilenangaben sein, da der Compiler den Text ja vollständig preprocessed erhält. Da würde aus einer Zeile 2 sonst schonmal eine Zeile 26341, wenn die Includes entsprechend lang und verschachtelt sind.
Das Pragma sagt dem Compiler (gcc?), dass er ab hier Felder in Strukturen immer auf 1-Byte-Grenzen ausrichten soll (sprich: kein Padding), bis zum entsprechenden Pragma pack(pop). Mit push wird also eine neue Ausrichtung auf einen Stapel geschoben, die so lange gilt bis mit pop wieder der alte Wert hergestellt wird (üblicherweise die Wortgröße des Prozessors).
-
gcc?
Ja.
Die #pragma-Anweisungen sind mir klarer. Die konnte ich auch in der GNU-Dokumentation finden. Die Sache mit den Zeilennummern (?) ist mir noch immer rätselhaft. Mir fehlt da ein Stichwort, nach dem ich suchen könnte.Was ich nicht verstehe: Warum sollten in einem vollständig "precompile-ten" Quell-File noch Informationen über Zeilennummern stehen?
PS: Am Anfang der Datei steht zB:
# 1 "main.c" # 1 "<built-in>" # 1 "<command line>" # 1 "main.c" # 1 "foo/include/windows.h" 1 # 16 "foo/include/windows.h"
-
bgdnoy schrieb:
Was ich nicht verstehe: Warum sollten in einem vollständig "precompile-ten" Quell-File noch Informationen über Zeilennummern stehen?
Weil in der präprozessierten (:D) Datei (z.B.) die Funktion main in Zeile 24634 beginnen würde. Du als Mensch möchtest aber gerne, dass der Compiler "Fehler in Zeile 2" ausgibt, wenn dort ein Fehler ist. Damit er das kann, muss er wissen, in welcher Zeile welcher Quell- oder Headerdatei Zeile 24634 einst war. Deshalb stehen in der präprozessierten Datei die Bezüge zu den Originaldateien.
-
LOL. Da sieht man, wie dumm man sein kann. Ich hatte erwartet, daß solche Dubug-Information in Kommentaren stecken wird, aber das tut sie nicht. Bei meinem gcc werden Kommentare nämlich schon vom Präprozessor entfernt (man lernt nie aus). Dann braucht man natürlich eine Instruktion für sowas.
Danke!
-
bgdnoy schrieb:
Bei meinem gcc werden Kommentare nämlich schon vom Präprozessor entfernt
Das ist nicht nur beim gcc so, sondern bei sämtlichen Compilern (Sprachdefinition)