C / C++ funktionsdeklaration / definition

#5179956
Lesenswert?
• ▲
▼
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.
#5181739
Lesenswert?
• ▲
▼
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.
#5182347
Lesenswert?
• ▲
▼
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.
#5182609
Lesenswert?
• ▲
▼
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.