O que main() deve retornar em C++? Comparação com C e padrões

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: A questão principal que até os profissionais fazem

\n\n

Você 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.

\n\n

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

\n\n

Resposta curta: o que main() deve retornar em C++?

\n\n

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

\n\n

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\n

Mas isso é apenas a ponta do iceberg. Vamos cavar mais fundo.

\n\n

Por que int e não void? Contexto histórico

\n\n

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

\n\n

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.

\n\n

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.

\n\n

Comparação entre C e C++: qual a diferença?

\n\n

Embora ambas as linguagens exijam int main(), existem algumas diferenças importantes:

\n\n
    \n
  • return 0 implícito em C++: Se você não escrever return no final de main(), o C++ insere automaticamente return 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[]) ou int 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
\n\n

Exemplo para C++ (funciona sempre):

\n\n
int main() {\n    std::cout << "C++ retornará 0 automaticamente" << std::endl;\n    // return 0; // pode não escrever\n}
\n\n

Exemplo 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\n

O que significam os códigos de retorno? Análise com exemplos

\n\n

O código de retorno é um

Blogs

Book Recommendations