Von dem, was ich von The C Book 4.2 erfassen kann, ist Ihre Funktionsdefinition kein Prototyp, da sie keine Typinformationen für die Argumente angibt. Dies bedeutet, dass der Compiler nur den Rückgabetyp merkt und keine Informationen über die Argumente erhält.
Diese Form der Definition ist weiterhin für Rückwärtskompatibilität zulässig und ist nicht auf Funktionen beschränkt, die keine Argumente annehmen. gcc wird gleichermaßen etwas wie
void hello(a) {
}
int main(int argc, char* argv[]) {
int test = 1234;
hello(test,1);
return 0;
}
zulassen Es ist nur das Fehlen von Typinformationen für die Argumente, die hier wichtig sind. Um dies zu beheben und sicherzustellen, dass gcc die Argumente prüft, wenn die Funktion verwendet wird, können Sie die Typinformationen entweder in eine Deklaration Ihrer Funktion oder in die Definition einfügen. Am besten würdest du sie in beide legen.
All dies beantwortet immer noch nicht wirklich Ihre Frage, warum gcc Sie nicht warnt. Es muss der Fall sein, dass das gcc-Team das Gefühl hat, dass es immer noch genug alten C-Code gibt, um zu rechtfertigen, dass die Warnung standardmäßig unterdrückt wird. IMO Ich bin überrascht, dass die Option -Wstrict-prototype
wie von @caf erwähnt nicht standardmäßig aktiviert ist.
@leppie: Ich folge nicht. Warum sollte der Compiler vor einem gültigen Aufruf einer Funktion warnen? – Troubadour
Wenn Sie das Flag "-Wstrict-prototypes" zu gcc hinzufügen, wird es warnen: 'xc: 4: Warnung: Funktionsdeklaration ist kein Prototyp' – caf
@caf: Danke :) – leppie