Hallo Welt ohne iostream?
-
Ich steh gerade aufm Schlauch. Ohne groß herumzureden: Wie sieht jetzt ein C++ Programm aus, welches ohne irgendwelche Sachen aus den C++-Headern "Hallo, Welt!" auf dem Bildschirm ausgibt? Ich meine, man muss doch irgendiwe auf betriebssystemspezifische Sachen zugreifen, aber wenn ich meine hallo_welt.cpp mit -E (unter g++ sieht man dann die Datei, nachdem sie vom Präprozessor bearbeitet wurde) kompiliere und das ganze dann in eine andere Datei umleite, hab ich da so 13000 Zeilen Code, aber nur bekanntes Zeugs aus der STL oder iostream. Wie genau komm ich denn auf meine Ausgabe?
-
-
Weil das eigentlich interessant in der runtime-Bibliothek passiert. read/write sind Systemaufrufe, stdin/stdout sind nur File-Deskriptoren (unter Unixoiden), diese werden von der Laufzeitbibliothek gekapselt. Der Rest macht das Betriebsystem.
-
Ich verstehs immer noch nicht richtig. Wo genau steht das denn jetzt im Code? Ich hab zwar sowas hier gefunden
extern "C" { int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) fwprintf (FILE*, const wchar_t*, ...); int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) wprintf (const wchar_t*, ...); //noch viel mehr davon.. (aber kein direktes printf) }und dazu noch sowas
namespace std { using ::vwprintf; using ::vwscanf; //und so weiter }Aber benutzt werden diese Funktionen irgendwie auch nicht im Code. Knivil's Erklärung leuchtet mir nicht wirklich ein..
-
In diesem Fall muss das keine variadic function sein:
http://ideone.com/p6Svk
-
Incocnito schrieb:
Ich verstehs immer noch nicht richtig. Wo genau steht das denn jetzt im Code? Ich hab zwar sowas hier gefunden
extern "C" { int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) fwprintf (FILE*, const wchar_t*, ...); int __attribute__((__cdecl__)) __attribute__ ((__nothrow__)) wprintf (const wchar_t*, ...); //noch viel mehr davon.. (aber kein direktes printf) }und dazu noch sowas
namespace std { using ::vwprintf; using ::vwscanf; //und so weiter }Zeile 385 in meiner
stdio.h(MinGW GCC 4.8):int __cdecl printf(const char * __restrict__ _Format,...);
-
Super, aber in meiner Datei g++ hallo_welt.cpp -E > xy.cpp steht nix von printf. Da sind, wie oben schon steht, ein paar Deklarationen und so, aber aufgerufen wird davon nichts (Strg-f sagt zumindest, dass diese Funktionen nur 2 mal, einmal in der Deklaration und in der using-Direktive vorkommen).
Entweder habe ich -E falsch verstanden oder aber eben das Thema meiner Frage nicht.Edit: Aber das kann man doch schlecht falsch verstehn:
Use the -E option to limit g++ to the preprocessor. This will cause g++ to process #include and #define directives and put the resulting source file on standard output.
g++ -E message.C >message.e
-
-
Incocnito schrieb:
Super, aber in meiner Datei g++ hallo_welt.cpp -E > xy.cpp steht nix von printf. Da sind, wie oben schon steht, ein paar Deklarationen und so, aber aufgerufen wird davon nichts (Strg-f sagt zumindest, dass diese Funktionen nur 2 mal, einmal in der Deklaration und in der using-Direktive vorkommen).
Entweder habe ich -E falsch verstanden oder aber eben das Thema meiner Frage nicht.Edit: Aber das kann man doch schlecht falsch verstehn:
Du weißt nicht, wie Header funktionieren. Das ist dein Problem.
Im fertigen Programm steht ein Aufruf an printf, welches wiederum aus der Laufzeitbibliothek gelinkt wird. Während des Compilierens reicht es zu wissen, dass eine solche Funktion existiert, aber es braucht niemand zu wissen, wie sie aussieht.
Wenn wieder wissen willst, wie printf funktionert: Es gibt ja OpenSource :p . Da wirst du aber auch nicht glücklich, unter Linuxruntimes wird da einfach nur read und write drinstehen (siehe knivil). Und wie read und write wieder funktionieren, kannst du natürlich auch nachlesen, aber wirst vermutlich auch dort nicht glücklich, weil du dich noch durch 20 weitere Abstraktionsschichten wühlen musst, damit irgendwann am Ende das BIOS der Grafikkarte ein paar Bytes im Grafikspeicher dreht.
-
aber in meiner Datei g++ hallo_welt.cpp -E > xy.cpp steht nix von printf
Muss auch nicht. Was am Ende konkret bei der Runtime aufgerufen wird, ist implementationsspezifisch.