4 Stimmen

gcc warnt nicht vor dem Aufruf einer Nullfunktion MIT Parametern?

Kann mir jemand sagen, warum in den Blazes GCC (z.B. 4.4.3) nicht warnt oder Fehler den falschen Aufruf einer nullary Funktion?

void hello() {
}

int main( int argc, char* argv[] ) {
 int test = 1234;
 hello(test);

 return 0;
}

(siehe auch http://bytes.com/topic/c/answers/893146-gcc-doesnt-warn-about-calling-nullary-function-parameters )

12voto

Weil:

void hello() {

bedeutet nicht das, was Sie denken, dass es bedeutet. Benutzen:

void hello( void ) {

Ohne die Leere sagen Sie, dass Sie sich nicht die Mühe machen können, die Parameter anzugeben. Beachten Sie, dass dies eine der vielen Möglichkeiten ist, wie sich C von C++ unterscheidet.

11voto

Prasoon Saurav Punkte 88056

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

Hinweis

In C++ ist das Ganze ein anderes Szenario. void hello() in C++ deklariert eine Funktion hello() die eine void und nimmt no arguments.

3voto

Troubadour Punkte 13047

Soweit ich das aus den folgenden Informationen entnehmen kann Das C-Buch 4.2 Ihre Funktionsdefinition ist kein Prototyp, da sie keine Typinformationen für die Argumente angibt. Das heißt, der Compiler merkt sich nur den Rückgabetyp und behält keinerlei Informationen über die Argumente.

Diese Form der Definition ist aus Gründen der Abwärtskompatibilität immer noch erlaubt und ist nicht auf Funktionen beschränkt, die keine Argumente annehmen. gcc erlaubt auch etwas wie

void hello( a ) {
}

int main( int argc, char* argv[] ) {
 int test = 1234;
 hello(test,1);

 return 0;
}

Wichtig ist hier nur das Fehlen von Typinformationen für die Argumente. Um dies zu beheben und sicherzustellen, dass gcc die Argumente überprüft, wenn die Funktion verwendet wird, können Sie die Typinformationen entweder in eine Deklaration Ihrer Funktion oder in die Definition aufnehmen. Vorzugsweise sollten Sie sie in beide aufnehmen.

All das beantwortet natürlich immer noch nicht wirklich Ihre Frage, warum gcc Sie nicht warnt. Es muss der Fall sein, dass das gcc-Team der Meinung ist, dass es immer noch genügend C-Code im alten Stil gibt, der es rechtfertigt, die Warnung standardmäßig zu unterdrücken. IMO bin ich überrascht, dass die -Wstrict-prototype ist, wie von @caf erwähnt, nicht standardmäßig aktiviert.

1voto

leppie Punkte 111830

Ha, das hatte ich neulich auch.

Ihre Definition muss lauten:

void hello(void);

Andernfalls kann die Funktion eine beliebige Anzahl von Parametern annehmen.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X