Warum erlaubt gcc, dass Argumente an eine Funktion übergeben werden, die so definiert ist, dass sie keine Argumente enthält?

 C Programming >> C-Programmierung >  >> Tags >> GCC
Warum erlaubt gcc, dass Argumente an eine Funktion übergeben werden, die so definiert ist, dass sie keine Argumente enthält?


Ich verstehe nicht, warum dieser Code kompiliert wird?


#include <stdio.h>
void foo() {
printf("Hello\n");
}
int main() {
const char *str = "bar";
foo(str);
return 0;
}

gcc gibt nicht einmal eine Warnung aus, dass ich zu viele Argumente an foo() übergebe. Ist dies das erwartete Verhalten?


Antworten:


In C akzeptiert eine mit leerer Parameterliste deklarierte Funktion beim Aufruf beliebig viele Argumente, die den üblichen arithmetischen Beförderungen unterliegen. Es liegt in der Verantwortung des Aufrufers sicherzustellen, dass die gelieferten Argumente für die Definition der Funktion geeignet sind.


Um eine Funktion mit null Argumenten zu deklarieren, müssen Sie void foo(void); schreiben .


Dies hat historische Gründe; Ursprünglich hatten C-Funktionen keine Prototypen, da sich C aus B, einer typlosen Sprache, entwickelte. Als Prototypen hinzugefügt wurden, wurden die ursprünglichen typlosen Deklarationen aus Gründen der Abwärtskompatibilität in der Sprache belassen.


Um gcc dazu zu bringen, vor leeren Parameterlisten zu warnen, verwenden Sie -Wstrict-prototypes :