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).