Warum können sich Prototyp und Definition einer Funktion in C unterscheiden?

Lesezeit: 1 Minute

Benutzer-Avatar
Zaffy

Ich frage mich, warum dies kompiliert wird:

int test();

int main() { return test((void*)0x1234); }
int test(void* data) { return 0; }

Warum gibt der Compiler keine Fehler/Warnungen dazu aus (ich habe clang, gcc versucht)? Wenn ich den Rückgabewert ändere, wird er nicht kompiliert – aber die Argumente können unterschiedlich sein?!

  • mögliches Duplikat von C void-Argumenten

    – PaulR

    25. Juli 2012 um 9:15 Uhr

Benutzer-Avatar
Paul R

Wenn Sie sich ändern:

int test();

zu:

int test(void);

Sie erhalten den erwarteten Fehler:

foo.c:4: error: conflicting types for ‘test’
foo.c:1: error: previous declaration of ‘test’ was here

Das ist weil int test(); deklariert einfach eine Funktion, die dauert irgendein Parameter (und ist daher kompatibel mit Ihrer späteren Definition von test), wohingegen int test(void); ist ein tatsächlicher Funktionsprototyp, der eine Funktion deklariert, die dauert nein Parameter (und welche ist nicht kompatibel mit der nachfolgenden Definition).

  • +1, um es in C-ish-Terminologie auszudrücken, int test() ist einfach kein Prototyp, sondern nur eine Erklärung.

    – Jens Gustedt

    25. Juli 2012 um 9:27 Uhr

  • Aber ein solches Verhalten wird bald veraltet sein (oder zumindest sagt uns das ISO C11).

    – EinArrayOfFunctions

    24. April 2015 um 21:02 Uhr


Benutzer-Avatar
ouah

 int test();

In einer Funktionsdeklaration bedeutet kein Parameter, dass die Funktion eine unbestimmte Anzahl von Argumenten akzeptiert.

Das ist anders als

 int test(void);

was bedeutet, dass die Funktion kein Argument akzeptiert.

Eine Funktionsdeklaration ohne Parameter ist der alte C-Stil der Funktionsdeklaration; C markiert diesen Stil als veraltet und rät von seiner Verwendung ab. Kurz gesagt, verwenden Sie es nicht.

In Ihrem Fall sollten Sie eine Funktionsdeklaration mit der richtigen Parameterdeklaration verwenden:

 int test(void *data);

  • Ich vergesse immer, dass C das tut! Auch wenn es so war int test(void); TU-übergreifend ist aber keine Diagnose erforderlich.

    – Flexo

    25. Juli 2012 um 9:09 Uhr


1251460cookie-checkWarum können sich Prototyp und Definition einer Funktion in C unterscheiden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy