Por que int main() {} compila?
-
09-06-2019 - |
Pergunta
(Estou usando Visual C++ 2008) Sempre ouvi dizer que main() é obrigatório para retornar um número inteiro, mas aqui não coloquei return 0;
e foi compilado com 0 erros e 0 avisos!Na janela de depuração aparece que o programa foi encerrado com o código 0.Se esta função tiver um nome diferente de main(), o compilador reclamará dizendo que 'blá' deve retornar um valor.Colando um return;
também faz com que o erro apareça.Mas deixando-o completamente de fora, ele compila perfeitamente.
#include <iostream>
using namespace std;
int main()
{
cout << "Hey look I'm supposed to return an int but I'm not gonna!\n";
}
Isso poderia ser um bug no VC++?
Solução
3.6.1 Função principal
....
2 Uma implementação não deve predefinir o
main
função.Esta função não deve ser sobrecarregada.Deve ter um tipo de retorno do tipoint
, mas caso contrário, seu tipo é definido pela implementação.Todas as implementações devem permitir ambas as seguintes definições de main:int main() { /* ... */ }
e
int main(int argc, char* argv[]) { /* ... */ }
....e continua adicionando ...
5A
return
declaração emmain
tem o efeito de sair da função principal (destruir quaisquer objetos com duração de armazenamento automática) e chamarexit
com o valor de retorno como argumento. Se o controle chegar ao fim domain
sem encontrar uma instrução return, o efeito é executar return 0;
tentando encontrar uma cópia online do padrão C++ para poder citar esta passagem Encontrei uma postagem no blog que cita todas as partes certas melhor do que eu.
Outras dicas
Isso faz parte do padrão da linguagem C++.Um retorno implícito 0 será gerado para você se não houver nenhuma instrução de retorno explícita em main.
Tenho certeza que o VC++ apenas insere um retorno 0 se você não incluir um nas funções principais.A mesma coisa pode acontecer com funções também, mas nesses casos pelo menos você receberá um aviso.
A seção 6.6.3/2 afirma: “Fluir do final de uma função é equivalente a um retorno sem valor;isso resulta em comportamento indefinido em uma função que retorna valor.".
Um exemplo é o código abaixo que, na melhor das hipóteses, avisa no VS 2010/g++
int f(){
if(0){
if(1)
return true;
}
}
int main(){
f();
}
Portanto, a questão toda é que 'principal' é especial, como apontaram as respostas anteriores.