Heim >Backend-Entwicklung >C++ >Warum wird eine C-Funktion ohne explizite „return'-Anweisung fehlerfrei kompiliert?

Warum wird eine C-Funktion ohne explizite „return'-Anweisung fehlerfrei kompiliert?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-17 08:13:24519Durchsuche

Why Does a C   Function Without an Explicit `return` Statement Compile Without Error?

Funktion, die einen undefinierten Wert in C zurückgibt

In einem Codeausschnitt, der in einer Bibliothek aufgetaucht ist, ist eine Funktion namens Min wie folgt definiert:

static tvec4 Min(const tvec4& a, const tvec4& b, tvec4& out)
{
    tvec3::Min(a,b,out);
    out.w = min(a.w,b.w);
}

Unerwarteterweise wird diese Funktion ohne Fehler kompiliert, obwohl sie keinen Wert zurückgibt, da ihr Rückgabetyp nicht explizit als deklariert ist void.

Gemäß dem C 11-Standardentwurf, Abschnitt 6.6.3, ist dieses Verhalten undefiniert. Der Standard besagt, dass „das Abfließen am Ende einer Funktion einer Rückgabe ohne Wert entspricht“ und dass „dies zu undefiniertem Verhalten in einer einen Wert zurückgebenden Funktion führt.“

In diesem Szenario ist der Compiler Es besteht keine Verpflichtung, einen Fehler oder eine Warnung bereitzustellen, da es in allen Fällen schwierig sein kann, das Problem genau zu diagnostizieren.

Allerdings können mit der -Wall-Flagge sowohl GCC als auch Clang aufgefordert werden, eine zu generieren Warnung ähnlich wie:

warning: control reaches end of non-void function [-Wreturn-type]

Um diese Warnung in einen Fehler umzuwandeln und so eine höhere Codequalität zu gewährleisten, kann das Flag -Werror=return-type verwendet werden. Darüber hinaus werden die Flags -Wextra -Wconversion -pedantic für eine umfassende Fehlererkennung empfohlen.

In Visual Studio würde der oben genannte Code den Fehler C4716 auslösen:

error C4716: 'Min' : must return a value

In Fällen, in denen nicht der gesamte Code vorhanden ist Wenn Pfade einen Wert zurückgeben, wird stattdessen die Warnung C4715 ausgegeben.

Das obige ist der detaillierte Inhalt vonWarum wird eine C-Funktion ohne explizite „return'-Anweisung fehlerfrei kompiliert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn