Introdução: A questão principal que até os profissionais fazem
\n\nVocê já se perguntou por que todo programa em C++ começa com int main(), e não com void main()? E o que realmente acontece quando você escreve return 0? Esta questão é um verdadeiro sucesso no Stack Overflow, acumulando milhares de visualizações e centenas de comentários. Aparentemente um tópico elementar, mas esconde uma camada inteira de sutilezas que separam C e C++, bem como desenvolvedores iniciantes e experientes.
Neste artigo, não daremos apenas uma resposta seca. Faremos uma comparação das abordagens em C e C++, analisaremos os padrões, mostraremos exemplos reais de código e explicaremos como trabalhar corretamente com o valor de retorno de main(), para que seu código não seja apenas funcional, mas também portável. Se você está estudando C++ ou programa nele todos os dias — este artigo é para você.
Resposta curta: o que main() deve retornar em C++?
\n\nSe você está com pressa, aqui está a essência: a função main() em C++ deve retornar int. Este é um requisito estrito do padrão (desde C++98 até C++23). O valor de retorno informa ao sistema operacional se o programa foi concluído com sucesso.
Aqui está o código mínimo correto:
\n\n#include <iostream>\n\nint main() {\n std::cout << "Hello, World!" << std::endl;\n return 0; // Conclusão bem-sucedida\n}\n\nMas isso é apenas a ponta do iceberg. Vamos cavar mais fundo.
\n\nPor que int e não void? Contexto histórico
\n\nNas primeiras versões de C (antes do padrão ANSI C), o tipo de main() não era estritamente definido. Muitos compiladores permitiam escrever void main(), e isso funcionava. No entanto, com a padronização (C89/C90 para C e C++98 para C++), foi decidido que main() deveria retornar um código de saída para o sistema operacional.
Por quê? Porque scripts, Makefiles e outros programas frequentemente verificam como seu processo foi encerrado. O código de retorno 0 significa "sucesso", e qualquer valor diferente de zero significa "erro" (ou um tipo específico de erro). Se main() fosse void, você não poderia transmitir essa informação.
Em C++, a situação é ainda mais rigorosa. O padrão C++ (seção [basic.start.main]) afirma diretamente: main() deve ser do tipo int. Qualquer outra declaração (por exemplo, void main()) é uma extensão do compilador e torna o código não portável.
Comparação entre C e C++: qual a diferença?
\n\nEmbora ambas as linguagens exijam int main(), existem algumas diferenças importantes:
- \n
- return 0 implícito em C++: Se você não escrever
returnno final demain(), o C++ insere automaticamentereturn 0. Em C (a partir de C99) isso também funciona, mas em padrões antigos (C89) a ausência de return resultava em comportamento indefinido. \n - Argumentos de linha de comando: Em C++, você pode declarar
int main(int argc, char* argv[])ouint main(). Em C, também existe uma terceira opção com o ambiente (char* envp[]), mas em C++ ela não é padronizada (embora muitos compiladores a suportem). \n - void main(): Em C, alguns compiladores (por exemplo, para sistemas embarcados) podem permitir
void main(). Em C++, isso é um erro grave e o código não compilará em modo estrito. \n
Exemplo para C++ (funciona sempre):
\n\nint main() {\n std::cout << "C++ retornará 0 automaticamente" << std::endl;\n // return 0; // pode não escrever\n}\n\nExemplo para C (requer return explícito em padrões antigos):
\n\n#include <stdio.h>\n\nint main() {\n printf("Em C89 é necessário retornar 0 explicitamente\\n");\n return 0; // obrigatório\n}\n\nO que significam os códigos de retorno? Análise com exemplos
\n\nO código de retorno é um