Às vezes, vejo codificadores que usam NULL
como valor de retorno main()
nos programas C e C ++, por exemplo, algo assim:
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return NULL;
}
Ao compilar esse código com o gcc, recebo o aviso de:
aviso: return torna inteiro do ponteiro sem conversão [-Wint-conversion]
o que é razoável porque a macro NULL
deve ser expandida (void*) 0
e o valor de retorno de main deve ser do tipo int
.
Quando eu faço um pequeno programa C ++ de:
#include <iostream>
using namespace std;
int main()
{
cout << "HelloWorld!";
return NULL;
}
E compilá-lo com g ++, recebo um aviso equivalente:
aviso: convertendo para o tipo não-ponteiro 'int' de NULL [-Wconversion-null]
Mas por que eles usam NULL
como valor de retorno main()
quando lança um aviso? É apenas um estilo de codificação ruim?
- Qual é o motivo para usar em
NULL
vez de0
como valor de retorno,main()
apesar do aviso? - É definido pela implementação se isso é apropriado ou não e, em caso afirmativo, por que alguma implementação desejaria obter um valor de ponteiro de volta?
EXIT_FAILURE
é 8, e parece que usar 1 não é bom para uma falha, já que às vezes é usado como sucesso em alguns programas.NULL
ponteiro como0
(sem uma conversão paravoid *
). Nesse caso, a falha passa despercebida e não gera um aviso. Ainda não é para isso que NULL deve ser usado.Respostas:
Sim.
Não. No C ++, a macro
NULL
não deve ser expandida para(void*) 0
[support.types.nullptr]. Só pode fazê-lo em C.De qualquer maneira, escrever código como este é enganoso, pois
NULL
deve se referir à constante de ponteiro nulo , independentemente de como ele é implementado. Usá-lo no lugar de umint
é um erro lógico.Ignorância. Não há uma boa razão para fazer isso.
Não, nunca é apropriado . Cabe à implementação se o compilador permite . Um compilador C ++ em conformidade pode permitir isso sem aviso.
fonte
Isso ocorre porque você compila com opções de compilador lax. Use rigorosas configurações padrão C
-std=c11 -pedantic-errors
e você obterá o erro esperado do compilador nas implementações em que seNULL
expande para a constante de ponteiro nulo(void*)0
. Consulte o tópico "Ponteiro do número inteiro / número inteiro do ponteiro sem conversão" .Em implementações onde se
NULL
expande para0
, o código é estritamente compatível com os padrões, mas com um estilo muito ruim, não portátil e, o pior de tudo: absurdo completo.No C ++ 11 e além,
NULL
não deve ser usado - em vez disso, usenullptr
. Retorná-lo de main () está incorreto, independentemente.NULL
sempre se expande para0
C ++, de forma estrita que funcionará, mas é um estilo muito ruim e o pior de tudo: um absurdo completo.Não apenas estilo de codificação ruim, mas sem sentido, sem qualquer justificativa. O programador que escreveu foi incompetente.
fonte
Pior. A maneira correta de indicar que o programa terminou corretamente é
fonte
exit()
(ou um valor de retorno 0 de main) significa o mesmo queEXIT_SUCCESS
.return
demain
. Portanto, uma versão mais "correta" do seu programa éint main(void){}
;-)Em? Alguns / muitos / todos? Implementações de C ++
NULL
é uma macro expandida para0
.Isso quando expandido em efeito dá
return 0
. Qual é um valor de retorno válido.Sim.
fonte