Warum können sich Prototyp und Definition einer Funktion in C unterscheiden?
Lesezeit: 1 Minute
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
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
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
12514600cookie-checkWarum können sich Prototyp und Definition einer Funktion in C unterscheiden?yes
mögliches Duplikat von C void-Argumenten
– PaulR
25. Juli 2012 um 9:15 Uhr