Je vois parfois des codeurs qui utilisent NULL
comme valeur de retour main()
dans les programmes C et C ++, par exemple quelque chose comme ça:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Quand je compile ce `code avec gcc, je reçois l'avertissement de:
avertissement: return rend entier à partir d'un pointeur sans transtypage [-Wint-conversion]
ce qui est raisonnable car la macro NULL
doit être étendue à (void*) 0
et la valeur de retour de main doit être de type int
.
Quand je fais un petit programme C ++ de:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
Et compilez-le avec g ++, j'obtiens un avertissement équivalent:
avertissement: conversion en type non-pointeur 'int' de NULL [-Wconversion-null]
Mais pourquoi utilisent-ils NULL
comme valeur de retour main()
quand il lance un avertissement? Est-ce juste un mauvais style de codage?
- Quelle est la raison d'utiliser
NULL
au lieu de0
comme valeur de retourmain()
malgré l'avertissement? - Est-il défini par l'implémentation si cela est approprié ou non et si oui, pourquoi une implémentation voudrait-elle récupérer une valeur de pointeur?
EXIT_FAILURE
est 8, et il semble que l'utilisation de 1 n'est pas bonne pour un échec car elle est parfois utilisée comme succès dans certains programmes.NULL
pointeur comme0
(sans transtypage envoid *
). Dans ce cas, la faille passe inaperçue et ne génère pas d'avertissement. Ce n'est toujours pas la raison pour laquelle NULL doit être utilisé.Réponses:
Oui.
Non. En C ++, la macro
NULL
ne doit pas s'étendre à(void*) 0
[support.types.nullptr]. Il ne peut le faire qu'en C.Quoi qu'il en soit, écrire du code comme celui-ci est trompeur car il
NULL
est censé faire référence à la constante du pointeur nul , quelle que soit la façon dont elle est implémentée. L'utiliser à la place d'unint
est une erreur logique.Ignorance. Il n'y a aucune bonne raison de le faire.
Non, ce n'est jamais approprié . C'est à l'implémentation si le compilateur le permet . Un compilateur C ++ conforme peut très bien le permettre sans avertissement.
la source
C'est parce que vous compilez avec les options du compilateur lax. Utilisez des paramètres standard C stricts
-std=c11 -pedantic-errors
et vous obtiendrez l'erreur de compilation attendue, sur les implémentations où seNULL
développe la constante de pointeur nul(void*)0
. Voir «Pointeur à partir d'un entier / entier à partir d'un pointeur sans transtypage» .Sur les implémentations où se
NULL
développe0
, le code est strictement conforme aux normes, mais très mauvais style, non portable et le pire de tout: un non-sens complet.Sur C ++ 11 et au-delà,
NULL
ne devrait pas être utilisé - utilisez plutôtnullptr
. Le renvoyer de main () est incorrect malgré tout.NULL
se développe toujours0
en C ++ donc à proprement parler cela fonctionnera, mais c'est un très mauvais style et le pire de tout: un non-sens complet.Pas seulement mauvais, mais un style de codage absurde sans aucune justification. Le programmeur qui l'a écrit était incompétent.
la source
Pire. La bonne façon d'indiquer que le programme s'est bien terminé est
la source
exit()
(ou une valeur de retour 0 de main) signifie la même chose queEXIT_SUCCESS
.return
frommain
. Donc, une version plus "correcte" de votre programme estint main(void){}
;-)Dans? Certains / plusieurs / tous? Les implémentations C ++
NULL
sont une macro étendue à0
.Ceci une fois étendu en effet donne
return 0
. Ce qui est une valeur de retour valide.Oui.
la source