2010-08-10 15 views

Antwort

1

Ha, ich hatte dies den anderen Tag.

Ihre Definition muss sein:

void hello(void); 

Else die Funktion beliebig viele Parameter annehmen kann.

Aber ich verstehe Ihren Standpunkt. Es gibt fast keine Compiler, die sogar die geringste Warnung dafür geben.

+1

@leppie: Ich folge nicht. Warum sollte der Compiler vor einem gültigen Aufruf einer Funktion warnen? – Troubadour

+3

Wenn Sie das Flag "-Wstrict-prototypes" zu gcc hinzufügen, wird es warnen: 'xc: 4: Warnung: Funktionsdeklaration ist kein Prototyp' – caf

+0

@caf: Danke :) – leppie

11

In C void hello() deklariert eine Funktion hello(), die eine void zurückgibt und unspecified number of arguments.

Hinweis

In C++ seine alle zusammen ein anderes Szenario. void hello() in C++ deklariert eine Funktion hello(), die eine void zurückgibt und no arguments.

12

Denn:

void hello() { 

bedeutet nicht, was Sie denken, es tut. Verwenden Sie:

void hello(void) { 

Ohne die Leere, Sie sagen, Sie können nicht belästigt werden, um die Parameter anzugeben. Beachten Sie, dass dies eine der vielen Möglichkeiten ist, die C von C++ unterscheidet.

4

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.

Verwandte Themen