Ich sehe manchmal Codierer, die NULL
als Rückgabewert von main()
in C- und C ++ - Programmen verwendet werden, zum Beispiel so etwas:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Wenn ich diesen Code mit gcc kompiliere, erhalte ich die Warnung:
Warnung: return macht eine Ganzzahl vom Zeiger ohne Umwandlung [-Wint-Konvertierung]
Dies ist sinnvoll, da das Makro NULL
erweitert werden soll (void*) 0
und der Rückgabewert von main vom Typ sein soll int
.
Wenn ich ein kurzes C ++ - Programm mache aus:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
Und kompiliere es mit g ++, ich bekomme eine gleichwertige Warnung:
Warnung: Konvertierung von NULL in den Nicht-Zeigertyp 'int' [-Wconversion-null]
Aber warum verwenden sie NULL
als Rückgabewert, main()
wenn eine Warnung ausgegeben wird? Ist es nur ein schlechter Codierungsstil?
- Was ist der Grund, trotz der Warnung
NULL
anstelle des0
Rückgabewerts zu verwendenmain()
? - Ist die Implementierung definiert, ob dies angemessen ist oder nicht, und wenn ja, warum sollte eine Implementierung einen Zeigerwert zurückerhalten wollen?
EXIT_FAILURE
ist 8, und es scheint, dass die Verwendung von 1 nicht gut für einen Fehler ist, da es manchmal in einigen Programmen als Erfolg verwendet wird.NULL
Zeiger als0
(ohne Umwandlung invoid *
) zu definieren . In diesem Fall bleibt der Fehler unbemerkt und generiert keine Warnung. Es ist immer noch nicht das, wofür NULL verwendet werden sollte.Antworten:
Ja.
Nein. In C ++
NULL
darf das Makro nicht auf(void*) 0
[support.types.nullptr] erweitert werden. Dies kann nur in C geschehen.In beiden Fällen ist das Schreiben von Code wie diesem irreführend, da
NULL
er sich auf die Nullzeigerkonstante beziehen soll , unabhängig davon, wie sie implementiert ist. Die Verwendung anstelle vonint
ist ein logischer Fehler.Ignoranz. Es gibt keinen guten Grund dafür.
Nein, das ist niemals angebracht . Es liegt an der Implementierung, ob der Compiler dies zulässt . Ein konformer C ++ - Compiler kann dies ohne Vorwarnung zulassen.
quelle
Dies liegt daran, dass Sie mit laxen Compileroptionen kompilieren. Wenn Sie strenge C-Standardeinstellungen verwenden
-std=c11 -pedantic-errors
, wird bei Implementierungen, bei denen dieNULL
Erweiterung auf die Nullzeigerkonstante erweitert wird, der erwartete Compilerfehler angezeigt(void*)0
. Siehe "Zeiger von Ganzzahl / Ganzzahl von Zeiger ohne Umwandlung" .Bei Implementierungen, bei denen
NULL
erweitert wird,0
ist der Code streng genommen standardkonform, aber sehr schlecht, nicht portabel und am schlimmsten: völliger Unsinn.Unter C ++ 11 und höher
NULL
sollte nicht verwendet werden - stattdessen verwendennullptr
. Die Rückgabe von main () ist trotzdem falsch.NULL
Erweitert sich0
in C ++ immer so streng, dass es funktioniert, aber es ist ein sehr schlechter Stil und das Schlimmste von allem: völliger Unsinn.Nicht nur schlecht, sondern unsinniger Codierungsstil ohne Begründung. Der Programmierer, der es geschrieben hat, war inkompetent.
quelle
Schlechter. Der richtige Weg, um anzuzeigen, dass das Programm einwandfrei beendet wurde, ist
quelle
exit()
(oder ein 0-Rückgabewert von main) dasselbe wieEXIT_SUCCESS
.return
ausmain
. Also, eine "korrektere" Version Ihres Programms istint main(void){}
;-)In? Einige / viele / alle? C ++ - Implementierungen
NULL
sind ein Makro, auf das erweitert wurde0
.Dies ergibt bei erweiterter Wirkung
return 0
. Welches ist ein gültiger Rückgabewert.Ja.
quelle