A veces veo codificadores que usan NULL
como valor de retorno de programas main()
C y C ++, por ejemplo, algo así:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Cuando compilo este `código con gcc me sale la advertencia de:
advertencia: return hace entero desde el puntero sin conversión [-Wint-conversion]
lo cual es razonable porque la macro NULL
se expandirá (void*) 0
y el valor de retorno de main será de tipo int
.
Cuando hago un breve programa en C ++ de:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
Y compilarlo con g ++, recibo una advertencia equivalente:
advertencia: conversión al tipo 'int' sin puntero desde NULL [-Wconversion-null]
Pero, ¿por qué usan NULL
como valor de retorno de main()
cuando arroja una advertencia? ¿Es solo un mal estilo de codificación?
- ¿Cuál es la razón para usar en
NULL
lugar de0
como valor de retorno amain()
pesar de la advertencia? - ¿Está definida por la implementación si esto es apropiado o no? De ser así, ¿por qué alguna implementación querría recuperar un valor de puntero?
EXIT_FAILURE
es 8, y parece que usar 1 no es bueno para un fracaso, ya que a veces se usa como un éxito en algunos programas.NULL
puntero como0
(sin una conversión avoid *
). En este caso, la falla pasa desapercibida y no genera una advertencia. Todavía no es para lo que debería usarse NULL.Respuestas:
Si.
No. En C ++, la macro
NULL
no debe expandirse a(void*) 0
[support.types.nullptr]. Solo puede hacerlo en C.De cualquier manera, escribir código como este es engañoso ya que
NULL
se supone que se refiere a la constante de puntero nulo , independientemente de cómo se implemente. Usarlo en lugar de unint
es un error lógico.Ignorancia. No hay una buena razón para hacer esto.
No, nunca es apropiado . Depende de la implementación si el compilador lo permite . Un compilador de C ++ conforme puede permitirlo sin previo aviso.
fuente
Esto se debe a que compila con opciones de compilador laxas. Use una configuración estándar C estricta
-std=c11 -pedantic-errors
y obtendrá el error del compilador esperado, en implementaciones donde seNULL
expande a la constante de puntero nulo(void*)0
. Consulte la sección "Puntero desde entero / entero desde puntero sin conversión" .En implementaciones en las que se
NULL
expande0
, el código es estrictamente hablando compatible con el estándar, pero con un estilo muy malo, no portátil y lo peor de todo: sin sentido.En C ++ 11 y versiones posteriores,
NULL
no debe usarse, en su lugar, úselonullptr
. Devolverlo desde main () es incorrecto independientemente.NULL
siempre se expande a0
C ++, por lo que, estrictamente hablando, funcionará, pero es un estilo muy malo y lo peor de todo: una completa tontería.No solo es malo, sino que tiene un estilo de codificación sin sentido sin ninguna justificación. El programador que lo escribió fue incompetente.
fuente
Peor. La forma correcta de indicar que el programa terminó bien es
fuente
exit()
(o un valor de retorno 0 de main) significa lo mismo queEXIT_SUCCESS
.return
demain
. Entonces, una versión más "correcta" de su programa esint main(void){}
;-)En? Algunos / muchos / todos? Las implementaciones de C ++
NULL
es una macro ampliada a0
.Esto cuando se expande en efecto da
return 0
. Cuál es un valor de retorno válido.Si.
fuente