2 Stimmen

Ist es tragbar, die Funktion nach dem Aufrufen in Hauptfunktion in C zu definieren und deklarieren?

Ich stieß auf den folgenden Unterschied in Bezug auf Funktionsdefinition/Deklaration zwischen C und C++.

In C++ erhalte ich eine Fehlermeldung "Funktionsname ist ungültiges Kennzeichen", wenn ich eine Funktion aufrufe, bevor ich sie deklariere und definiere, was für mich in Ordnung ist, da es vernünftig klingt.

In C mit Visual Studio Compiler erhalte ich die Fehlermeldung, als ich das folgende Programm kompilierte:

Fehler C2371: 'fun': Redefinition; unterschiedliche Grundtypen

Und in gcc-4.3.4 wurde es erfolgreich mit nur dieser Warnung ausgeführt:

Warnung: widersprüchliche Typen für 'fun'

Hier geht es zum Programm:

#include 
int main(){
    fun();
    return 0;
}
void fun(){
    printf("Es macht Spaß");
}

Ist es also in C in Ordnung, einfach eine Funktion aufzurufen und sich später um die Definition zu kümmern?! Und warum verhalten sich die Compiler unterschiedlich?

2voto

fge Punkte 115782

Sie müssen die Funktion zuerst deklarieren. Wenn sie nicht deklariert ist, wird standardmäßig angenommen, dass die Funktion int zurückgibt und eine beliebige Anzahl von Argumenten entgegennimmt.

2voto

wolfgang Punkte 4763

Wenn Sie die Funktion in C89 ohne Prototyp aufrufen (Haftungsausschluss: Ich kenne C99 nicht), deklarieren Sie sie implizit als

int fun();

Beachten Sie, dass in C, im Gegensatz zu C ++, die leeren Klammern nur bedeuten, dass Sie nicht angegeben haben, welche Argumente es annimmt, nicht dass es null Argumente annimmt.

Wenn Sie die Funktion als Rückgabe von void neu deklarieren, erhalten Sie die Warnung, aber keinen Fehler. Wenn Sie stattdessen etwas Nicht-Triviales zurückgeben (Strukturen, Floats, ...) anstelle von void oder wenn Sie versuchen, das int-Ergebnis der Funktion zu verwenden, könnten Sie at Laufzeit in großen Schwierigkeiten geraten.

1voto

Prasoon Saurav Punkte 88056

In C erfolgt die 'implizite int'-Rückgabetyp-Unterstützung d.h. fun(); wird als Deklaration einer Funktion fun interpretiert, die keine Argumente entgegennimmt und einen int zurückgibt. Dies liegt daran, dass Sie die Funktion zuvor nicht deklariert haben.

In C++ ist dies nicht der Fall, hier ist Ihr Code fehlerhaft.

1voto

sharptooth Punkte 162790

Dies funktioniert nur zuverlässig in C, wenn die Funktion keine Parameter hat und int zurückgibt, also ja, es ist portabel, aber eine sehr schlechte Praxis - hier ist ein sehr gutes Beispiel, das erklärt, warum.

1voto

Jens Gustedt Punkte 74457

Dein Code ist ungültig für C++ (wie bereits von anderen erwähnt) und auch für C99. Keines von ihnen erlaubt die implizite Deklaration von Funktionen.

Es gibt nicht viel Grund, so etwas zuzulassen. Es ist nicht sehr schwierig, eine Headerdatei zu pflegen, die das Prototyp der von dir verwendeten Funktionen enthält.

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