É uma pergunta simples, mas continuo vendo respostas conflitantes: a rotina principal de um programa C ++ deve retornar 0
ou EXIT_SUCCESS
?
#include <cstdlib>
int main(){return EXIT_SUCCESS;}
ou
int main(){return 0;}
Eles são exatamente a mesma coisa? EXIT_SUCCESS
Só deve ser usado com exit()
?
Eu pensei EXIT_SUCCESS
que seria uma opção melhor, porque outro software pode querer considerar zero como falha, mas também ouvi dizer que, se você retornar 0
, o compilador poderá alterá-lo para um valor diferente de qualquer maneira.
c++
c
return-value
main
Trevor Hickey
fonte
fonte
0
eEXIT_SUCCESS
é interpretada como um sucesso.Respostas:
EXIT_FAILURE
, em uma declaração de retornomain
ou como argumento paraexit()
, é a única maneira portátil de indicar falha em um programa C ou C ++.exit(1)
pode realmente sinalizar o término bem-sucedido no VMS, por exemplo.Se você estiver usando
EXIT_FAILURE
quando seu programa falhar, poderá usá-EXIT_SUCCESS
lo quando for bem-sucedido, apenas por uma questão de simetria.Por outro lado, se o programa nunca sinalizar falha, você pode usar
0
ouEXIT_SUCCESS
. Ambos são garantidos pelo padrão para sinalizar uma conclusão bem-sucedida. (É pouco possível queEXIT_SUCCESS
possa ter um valor diferente de 0, mas é igual a 0 em todas as implementações que já ouvi falar.)Usar
0
tem a menor vantagem de que você não precisa#include <stdlib.h>
em C ou#include <cstdlib>
em C ++ (se estiver usando umareturn
instrução em vez de chamarexit()
) - mas para um programa de qualquer tamanho significativo, você incluirá stdlib direta ou indiretamente de qualquer forma.Para essa matéria, em C começando com o padrão 1999 e, em todas as versões do C ++, chegando ao fim de
main()
faz um implícitareturn 0;
qualquer maneira, então você pode não precisar usar tanto0
ouEXIT_SUCCESS
explicitamente. (Mas pelo menos em C, considero explícito umreturn 0;
estilo melhor.)(Alguém perguntou sobre o OpenVMS. Eu não o uso há muito tempo, mas, como eu me lembro, valores de status ímpares geralmente indicam sucesso, enquanto valores pares denotam falha. A implementação C é mapeada
0
para1
, de modo quereturn 0;
indica término bem-sucedido. Outros valores são passados inalterados ,return 1;
também indica encerramento com êxito.EXIT_FAILURE
teria um valor par diferente de zero.)fonte
0
eEXIT_SUCCESS
não é garantido que tenham o mesmo valor (mencionei isso na minha resposta), mas ambos denotam rescisão bem-sucedida.EXIT_SUCCESS
é estilisticamente melhor se você também estiver usandoEXIT_FAILURE
, masexit(0)
tudo bem.Isso não importa. Ambos são iguais.
Citações padrão C ++:
fonte
EXIT_SUCCESS == 0
. Por outro lado, não há uma boa razão para isso não acontecer.0 é, por definição, um número mágico. EXIT_SUCCESS é quase universalmente igual a 0, felizmente. Então, por que não apenas retornar / sair 0?
exit (EXIT_SUCCESS); é abundantemente claro em significado.
saída (0); por outro lado, é contra-intuitivo em alguns aspectos. Alguém não familiarizado com o comportamento do shell pode assumir que 0 == false == é ruim, assim como todos os outros usos de 0 em C. Mas não - nesse caso especial, 0 == success == good. Para os desenvolvedores mais experientes, não será um problema. Mas por que viajar com o novo cara sem absolutamente nenhuma razão?
tl; dr - se existe uma constante definida para o seu número mágico, quase nunca existe uma razão para não usar a constante em primeiro lugar. É mais pesquisável, geralmente mais claro etc. e não custa nada.
fonte
fclose()
,setvbuf()
, ...), POSIX (listen()
,pthread_create()
,pipe()
, ...), e muitos, muitos outros (por exemplo, bibliotecas OpenGL [glGetError()
], zlib [deflate()
/inflate()
/ ...], SDL [SDL_CreateWindowAndRenderer()
/ ...], e Mais).Esta é uma história sem fim que reflete os limites (um mito) da "interoperabilidade e portabilidade acima de tudo".
O que o programa deve retornar para indicar "sucesso" deve ser definido por quem está recebendo o valor (o sistema operacional ou o processo que invocou o programa) e não por uma especificação de idioma.
Mas os programadores gostam de escrever código de "maneira portátil" e, portanto, inventam seu próprio modelo para o conceito de "sistema operacional" que define valores simbólicos a serem retornados.
Agora, em um cenário de muitos para muitos (onde muitos idiomas servem para gravar programas em muitos sistemas), a correspondência entre a convenção de idiomas para "sucesso" e a convenção do sistema operacional (que ninguém pode conceder para ser sempre a mesma) deve ser tratado pela implementação específica de uma biblioteca para uma plataforma de destino específica.
Mas - infelizmente - esses conceitos não estavam tão claros no momento em que a linguagem C foi implantada (principalmente para escrever o kernel do UNIX), e os gigagramas de livros foram escritos dizendo "retorno 0 significa sucesso", pois isso era verdade no sistema operacional em naquele tempo tendo um compilador C.
A partir de então, nenhuma padronização clara foi feita sobre como essa correspondência deve ser tratada. C e C ++ têm sua própria definição de "valores de retorno", mas ninguém concede uma tradução adequada do sistema operacional (ou melhor: nenhuma documentação do compilador diz nada sobre isso). 0 significa sucesso se verdadeiro para UNIX - LINUX e - por razões independentes - também para Windows, e isso cobre 90% dos "computadores consumidores" existentes, que - na maioria dos casos - desconsideram o valor de retorno (para que possamos discutir por décadas, mas ninguém nunca notará!)
Nesse cenário, antes de tomar uma decisão, faça as seguintes perguntas: - Estou interessado em comunicar algo ao meu interlocutor sobre minha existência? (Se eu sempre retornar 0 ... não há nenhuma pista por trás de tudo) - Meu interlocutor está tendo convenções sobre essa comunicação? (Observe que um único valor não é uma convenção: isso não permite nenhuma representação de informações)
Se ambas as respostas não forem, provavelmente a boa solução é não escrever a declaração principal de retorno. (E deixe o compilador decidir, em relação ao destino que está trabalhando).
Se nenhuma convenção estiver em vigor 0 = sucesso, atenda à maioria das situações (e o uso de símbolos pode ser problemático, se introduzir uma convenção).
Se houver convenções, assegure-se de usar constantes simbólicas que sejam coerentes com elas (e garanta a coerência da convenção, e não a coerência de valor, entre plataformas).
fonte
Depois de começar a escrever o código que pode retornar uma infinidade de status de saída, você começa
#define
todos eles. Nesse caso,EXIT_SUCCESS
faz sentido no contexto de não ser um " número mágico ". Isso torna seu código mais legível, pois todos os outros códigos de saída serãoEXIT_SOMETHING
. Se você simplesmente escrever um programa que retornará quando terminar,return 0
é válido e provavelmente ainda mais limpo, porque sugere que não há uma estrutura sofisticada de código de retorno.fonte
O que você retorna de um programa é apenas uma convenção.
Não, não consigo pensar em nenhuma circunstância em que "EXIT_SUCCESS" não seja "0".
Pessoalmente, eu recomendaria "0".
NA MINHA HUMILDE OPINIÃO...
fonte
0
é falso e muitas funções retornam0
em caso de falha / sem fazer nada.Se você usar EXIT_SUCCESS, seu código será mais portátil.
http://www.dreamincode.net/forums/topic/57495-return-0-vs-return-exit-success/
fonte
EXIT_SUCCESS
ambos denotam encerramento com êxito.Alguns compiladores podem criar problemas com isso - em um compilador Mac C ++, EXIT_SUCCESS funcionou bem para mim, mas em um complemento Linux C ++, tive que adicionar cstdlib para saber o que é EXIT_SUCCESS. Fora isso, eles são o mesmo.
fonte
EXIT_SUCCESS
trabalhado sem incluir um<stdlib.h>
ou<cstdlib>
, algum outro cabeçalho deve ter definido, direta ou indiretamente. Em C ++, é comum para cabeçalhos padrão para#include
outros cabeçalhos padrão. Se isso compilar sem erro:int main() { return EXIT_SUCCESS; }
provavelmente o seu compilador está com erros.