Wie setzt Visual Studio die Dateien zusammen?
-
Hey ihr,
Seid ich mit Visual Studio arbeite frage ich mich immer, wie beim Compilieren genau die Dateien zusammen gesetzt werden.
Quasi: Was macht der compiler wann.Das ist wichtig zum darin programmieren zu koennen.
Der Compiler faengt ja in der .cpp datei wo die Mainfunktion definiert ist an.
Dann instanziert er das erste Formular und setzt vorher den Header in die CPP Datei des Formulares zusammen.
Die zusammen gesetzte Datei wird dann durchgerattert bis zum Ende.
Wenn ich innerhalb dieses Formulares von anderen Formularen andere Instanzen erstelle wird das selbe gemacht?Stimmt das so etwa?
Gibt es irgendwo hier im Forum ne genauere Beschreibung.Danke
David
-
Was du beschreibst mit instanzieren eines Formulars etc. ist ja ne logische Sicht auf den Programmablauf, damit hat der Compiler gar nichts zu tun, der weiß net was das Programm wie tut. Beschreibungen wie nen Compiler funktioniert gibts zu Genüge, einfach mal bei Wikipedia oder so gucken.
-
Naja - stimmte denn meine Beschreibung schon einigermassen?
Wie ein Compiler funktioniert weiss ich auch bereits so ungefaer, weil ich mir Texte zum Compilerbau durchgelesen habe.
Ich will halt nur wissen, wie die Dateien am Ende behandelt werden.
Sprich: Welche CPP Datei wird wann durchlaufen und welche CPP Dateien im Projekt kommen zuerst dran oder zu letzt...
-
Du hast Recht wenn du sagst die Programmausführung beginnt in der Main Funktion da dies in den allermeisten Fällen der Einstiegspunkt des Programms ist. Alles weitere hängt halt davon ab wie die Programmlogik aufgebaut ist.
Es gibt im fertigen Programm aber keine Cpp oder Header Dateien, jegliche Zuordnung geht verloren beim Compilieren, deshalb kann man nicht sagen erst kommt die Datei und danach jene.
Der Compiler weiß streng genommen nicht mal was von Headern da die durch den Preprocessor schon eliminiert werden. Im Grunde werden alle Headerangaben in der Cpp durch den Inhalt der Headerdatei ersetzt so dass ein langer Quellcode rauskommt und den nimmt der Compiler sich vor und kompiliert den zu ner Objektdatei. Das macht er für jede Cpp Datei. Mehr macht der Compiler net, der weiß noch net mal ob das was er kompiliert hat eindeutig aufgelöst ist. Erst der Linker nimmt sich alle Objektdateien und löst Verweise untereinander auf, der sieht dann auch wenn irgendwo ne Funktion auftaucht die vielleicht nirgends definiert ist. Aber auch er weiß net wie wann was aufgerufen wird. Dass bestimmt alleine die Programmlogik.
-
777 schrieb:
Ich will halt nur wissen, wie die Dateien am Ende behandelt werden.
Sprich: Welche CPP Datei wird wann durchlaufen und welche CPP Dateien im Projekt kommen zuerst dran oder zu letzt...Ganz so einfach wie du es dir vorstellst ist es nicht zu beantworten.
Beispiel aus der Praxis:
Ein Entwickler mit dem ich Kontakt hatte, hatte lange Zeit globale Variablen geliebt, und war auch immun gegen jegliche Verbesserungsvorschäge. Eines Tages (Nach einem Compilerwechsel) lief das Programm nicht mehr rund.
Warum? Die Dateien wurden in einer anderen Reihenfolge angezogen, und ein paar seiner globalen Variablen waren gegenseitig abhängig (Das war dann auch der Zeitpunkt an dem ich ihn endlich von den globalen Variablen abbringen konnte).cu André
-
Okay - vielen Dank fuer die netten Erklaerungen.
Das bedeutet, dass folgende Beispiel tut ungefaer so etwas hier:Nehmen wir an wir haben ein Projekt mit zwei Formularen.
Das Erste Formular instanziert automatisch das Zweite, was bedeutet, dass in Formular 1, 'Form2.h' eingebunden ist.
Man hat dann folgende Dateien (grob gesagt):Form1.h
Form2.h
Form2.cpp
Projektname.cppAls erstes packt der Praeprozessor den Inhalt der Form1.h/Form2.h zusammen mit dem Inhalt der 'Projektname.cpp'.
Somit entsteht eine Temporaete Datei, die vermutlich nur im Arbeitsspeicher existiert.Die Form2.h und Form2.cpp werden auf die selbe Art und Weise zusammen gesetzt, sodass im Prinzip zwei temporaere Dateien entstehen.
Diese werden nun nacheinander von vorne nach hinten vom Compiler uebersetzt und vorher zu einer grossen Tempdatei gemacht.
Der Linker sucht sich zudem alle noetigen Dateien zusammen, die gebraucht werden um das Programm lauffaehig zu machen und packt diese auch noch mit in den Code.
Der Compiler prueft vorher auf Syntax und all das andere Zeug.
Am Ende hat man dann managbaren Code (im .NET Bereich zumindest), welcher von jeder CLI Plattform interpretiert werden kann.Selbstverstaendlich befinden sich an den Stellen, wo Form1, das zweite Formular benutzt dann Jumper zu den jeweiligen Stellen.
Ich weiss, dass das jetzt nur grob beschrieben war aber es war auch nicht mein Ziel einen wissenschaftlichen Text zu verfassen, sondern nur UNGEFAEHR zu verstehen, was genau geschieht, wenn ich dann F5 druecke.
-
Ich weiss, dass das jetzt nur grob beschrieben war aber es war auch nicht mein Ziel einen wissenschaftlichen Text zu verfassen, sondern nur UNGEFAEHR zu verstehen, was genau geschieht, wenn ich dann F5 druecke.
Wie ein Compiler funktioniert weiss ich auch bereits so ungefaer, weil ich mir Texte zum Compilerbau durchgelesen habe.
-
[quote="asc"]
777 schrieb:
Das war dann auch der Zeitpunkt an dem ich ihn endlich von den globalen Variablen abbringen konnte.
Oh was für ein Held :xmas2:
-
Naja - wollte eig nur wissen ob ich das, was ich weiss oder gelesen habe richtig
Verstanden habe.
Meiner Meinung nach hat man was nur dann richtig verstanden, wenn man es
in eigenen Worten wiedergeben und erklaeren kann... das hab ich dann hier versucht und suchte Bestaetigung
-
Ich hab keine Compilerbaubücher gelesen, halte aber
Der Compiler faengt ja in der .cpp datei wo die Mainfunktion definiert ist an.
Dann instanziert er das erste Formular und setzt vorher den Header in die CPP Datei des Formulares zusammen.für Blödsinn. Afaik erstellt der Compiler keine Klassen aus dem zu übersetzenden Quellcode.
Diese werden nun nacheinander von vorne nach hinten vom Compiler uebersetzt und vorher zu einer grossen Tempdatei gemacht.
AFAIK wird aus jeder .c oder .cpp Datei ein Objektfile erstellt. Das zusammensetzen wird dann durch den Linker erledigt.
Ich weiß nicht wie grob Deine Vorstellung sein darf, aber viel von einem Entwickler hat sie vermutlich nicht.
-
Kennt denn wer einen Artikel, wo es besser beschrieben ist?
Naja... beruflich mach ich C++ eigentlich ja auch nicht.
Bin eigentlich Systemadmin...
-
777 schrieb:
Kennt denn wer einen Artikel, wo es besser beschrieben ist?
Naja... beruflich mach ich C++ eigentlich ja auch nicht.
Bin eigentlich Systemadmin...Ja dann, gute Nacht Marie :xmas2:
-
Weil ich C++ nicht beruflich mache, oder Systemadmin bin?
-
Weil Du C++ nicht beruflich machst und Systemadmin bist...
-
Ich bin auch in unserer Firma der einzige Systemadmin der ueberhaupt programmiert.
Alle anderen meinen immer Programmierer wuerden alle mit der Zeit verrueckt spielen und Selbstmord begehen... ich habe das Gefuehl Systemadmins und Programmierer koennen nicht so gut miteinander.
Bisher hat bei mir dann doch immer beides geklappt: Der Job und das Hobby
-
Alle anderen meinen immer Programmierer wuerden alle mit der Zeit verrueckt spielen und Selbstmord begehen...
Oh Gott, wenn meine Frau das hört...
-
Naja... ich finds gerade geil wenn man Systemintegration und Programmieren gleichzeitig macht, da es einem in Systemintegration oft hilft ein bisschen so zu denken, wie ein Programmierer.
Allerdings muss man sich wohl frueher oder spaeter fuer eine Spate entscheiden, weil man sonst echt Selbstmord begeht, da es einfach zu viel ist ^^
Naja... bin erst 19 und hab noch viel Zeit zu entscheiden...
Die Leute im Forum scheinen das hier ja echt alle Beruflich zu machen und nebenher immer im Forum zu schreiben.Find ich schon bewundernswert...
-
Aber eventuell kann ja auch wenn ich Systemadmin bin trotzdem noch jemand meine Frage beantworten.
Ich finde im Netz naemlich dazu nicht wirklich eine Beschreibung.Beispielsweise habe ich gerade mal rein Testweise zwei Formulare in Visual Studio erstellt und in die Form2.cpp einen Haltepunkt gesetzt und eine Variable definiert.
Allerdings wird dieser Haltepunkt niemals angesprochen, wenn ich die Formulare erstelle.
Wann genau wird der Code in CPP-Dateien ueberhaupt ausgefuert???Wenn ich Schrittweise durch die Instanzierung des Formulares 2 gehe kommt die CPP-Datei ebenfalls niemals zum tragen.
Aber irgendwann muss sie es doch mal...
-
Dann wird der Code nicht ausgeführt, oder der Debugger ist Müll.* Wahrscheinlicher ist das erste. So pauschal wird Dir das aber niemand beantworten können. Höchstens, wenn wir den Code sehen.
Das hat aber mit Deiner ursprünglichen Frage nichts zu tun. Der Compiler liest die Dateien in der Reihenfolge, die man ihm vorgibt (bzw. die Deine IDE und deine #include-Anweisungen ihm vorgeben).
Edit:
* Oder der Debugger wird falsch aufgerufen, oder Du kompilierst das ganze in einer nicht Debugging-tauglichen Form.
-
Naja... habe gerade herausgefunden - nach ein bisschen Herumprobieren -, dass diese CPP Dateien, die erstellt werden sobald man ein Formular hinzufuegt eigentlich ueberfluessig sind.
Sie werden weder mit kompiliert noch was anderes.
Es wird nur dann auf sie zurueckgegriffen, wenn der Programmierer eigene Funktionen da ausgelagert hat.
Variablen die da definiert sind koennen nicht global verwendet werden, sondern sind nur sinnvoll, wenn sie in Funktionen gekapselt sind...