Kann jemand erklären was passiert wenn eine Funktion ohne Rückgabewert nicht mit void deklariert / definiert wird? z.B: void funktion(char * s, size_t n);
Fabio S. schrieb: > Kann jemand erklären was passiert wenn eine Funktion ohne Rückgabewert > nicht mit void deklariert / definiert wird? nichts, was soll da passieren?
1 | int funktion(char * s, size_t n); |
wenn kein return vorhanden ist, gibt es eine Meldung vom Compiler.
Fabio S. schrieb: > Kann jemand erklären was passiert wenn eine Funktion ohne Rückgabewert > nicht mit void deklariert / definiert wird? > > z.B: > > void funktion(char * s, size_t n); Wenn die ganze Funktion nicht deklariert ist, aber verwendet (aufgerufen) wird, dann geht der Compiler davon aus, daß diese Funktion einen int Returntype hat, den er dann auch verwendet. Ungeachtet der Frage, ob die Funktion überhaupt was sinnvolles im "Return-Register" hinterläßt. Die Parameter-Anzahl ist erstmal egal, da in C der Caller für das Entfernen derer vom Stack zuständig ist. Wenn man allerdings zu wenige liefert und/oder die Funktion diese "lustig benutzt", z.B. Einen Pointer erwartet und dessen Ziel beschreiben will, ist überraschendes Verhalten vorprogrammiert.
Carl D. schrieb: > Wenn die ganze Funktion nicht deklariert ist, aber verwendet > (aufgerufen) wird, dann geht der Compiler davon aus, daß diese Funktion > einen int Returntype hat, den er dann auch verwendet. Allerdings nur in C, nicht in C++. Im Ursprungsposting wurde immerhin nach "C / C++" gefragt. Das sind aber zwei verschiedene Sprachen. > Die Parameter-Anzahl ist erstmal egal, da in C der Caller für das > Entfernen derer vom Stack zuständig ist. C-Compiler machen das typischerweise so, aber C schreibt es nicht vor. Es schreibt nicht mal vor, dass es einen Stack geben muss.
Rolf M. schrieb: > Carl D. schrieb: >> Wenn die ganze Funktion nicht deklariert ist, aber verwendet >> (aufgerufen) wird, dann geht der Compiler davon aus, daß diese Funktion >> einen int Returntype hat, den er dann auch verwendet. > > Allerdings nur in C, nicht in C++. Im Ursprungsposting wurde immerhin > nach "C / C++" gefragt. Das sind aber zwei verschiedene Sprachen. Ist bekannt, nur scheint ja keine Sprache/Compiler im Spiel zu sein, die/der da pedantisch ist, sonst hätte es nämlich Fehlermeldungen gegeben. Deswegen meine Beschreibung von Steinzeit-C. >> Die Parameter-Anzahl ist erstmal egal, da in C der Caller für das >> Entfernen derer vom Stack zuständig ist. > > C-Compiler machen das typischerweise so, aber C schreibt es nicht vor. > Es schreibt nicht mal vor, dass es einen Stack geben muss. Was es allerdings erfordert, ist ein Verfahren, das bei variabler Anzahl Parameter (printf) funktioniert und da ist ein Stack auf den die Parameter "von hinten her" ge-pushed werden, eine praktikable Lösung. Ob sich dieses Konstrukt von einen SO-Register verwaltet wird, oder wie beim ARM, jedes Register eine Stapelverwaltung beherrscht, ist egal.
Carl D. schrieb: >> Allerdings nur in C, nicht in C++. Im Ursprungsposting wurde immerhin >> nach "C / C++" gefragt. Das sind aber zwei verschiedene Sprachen. > Ist bekannt Ja, dir schon, aber dem TE evtl. nicht. Da zumindest in der Überschrift explizit auch C++ auftaucht, fand ich das relevant. >> C-Compiler machen das typischerweise so, aber C schreibt es nicht vor. >> Es schreibt nicht mal vor, dass es einen Stack geben muss. > Was es allerdings erfordert, ist ein Verfahren, das bei variabler Anzahl > Parameter (printf) funktioniert und da ist ein Stack auf den die > Parameter "von hinten her" ge-pushed werden, eine praktikable Lösung. Ja. Du schriebst, dass das "in C" so sei. Ich wollte nur klarstellen, dass das erstmal nicht Bestandteil von C selbst, sondern ein Implementationsdetail der Compiler ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.