Warum wird dieses C-Snippet kompiliert, obwohl ein Rückgabewert fehlt?
Im bereitgestellten Code-Snippet:
static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out) { tvec3::Min(a, b, out); out.w = min(a.w, b.w); }
Die Funktion Min ist so deklariert, dass sie einen tvec4 zurückgibt, aber der Code stellt keine explizite Return-Anweisung bereit. Dies wirft die Frage auf, warum der Compiler den Code fehlerfrei kompiliert.
Undefiniertes Verhalten
Laut dem C 11-Standardentwurf fließt es am Ende eines Werts ab -returning-Funktion ohne Bereitstellung eines Rückgabewerts führt zu undefiniertem Verhalten. Dies bedeutet, dass der Compiler in solchen Fällen nicht verpflichtet ist, einen Fehler oder eine Warnung auszugeben.
Compiler-Optionen
Compiler können jedoch so konfiguriert werden, dass sie warnen oder sogar Fehler generieren für undefiniertes Verhalten. Beispielsweise kann die Verwendung des Flags -Wall häufig eine Warnung auslösen wie:
warning: control reaches end of non-void function [-Wreturn-type]
Durch Hinzufügen des Flags -Werror=return-type behandelt der Compiler diese Warnung als Fehler und erzwingt dies durch den Code korrigiert.
Visual Studio
In Visual Studio generiert der Code den Fehler C4716 von Standard:
error C4716: 'Min' : must return a value
In Fällen, in denen nicht alle Codepfade einen Wert zurückgeben, gibt Visual Studio eine Warnung aus (C4715).
Das obige ist der detaillierte Inhalt vonWarum wird eine C-Funktion trotz der Deklaration eines Rückgabetyps ohne explizite Return-Anweisung kompiliert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!