Qual é a assinatura adequada da main
função em C ++? Qual é o tipo de retorno correto e o que significa retornar um valor main
? Quais são os tipos de parâmetros permitidos e quais são seus significados?
Este sistema é específico? Essas regras mudaram com o tempo? O que acontece se eu violá-los?
main
retornar em C e C ++ .Respostas:
A
main
função deve ser declarada como uma função não membro no espaço para nome global. Isso significa que ela não pode ser uma função de membro estática ou não estática de uma classe, nem pode ser colocada em um espaço para nome (mesmo no espaço para nome sem nome).O nome
main
não está reservado no C ++, exceto como uma função no espaço para nome global. Você pode declarar outras entidades nomeadasmain
, incluindo, entre outras coisas, classes, variáveis, enumerações, funções de membro e funções de não membro que não estão no espaço de nomes global.Você pode declarar uma função nomeada
main
como uma função membro ou em um espaço para nome, mas essa função não seria amain
função que designa onde o programa é iniciado.A
main
função não pode ser declarada comostatic
ouinline
. Também não pode ser sobrecarregado; pode haver apenas uma função nomeadamain
no espaço para nome global.A
main
função não pode ser usada no seu programa: você não pode chamar amain
função de qualquer lugar do seu código, nem o endereço dele.O tipo de retorno de
main
deve serint
. Nenhum outro tipo de retorno é permitido (esta regra está em negrito porque é muito comum ver programas incorretos que são declaradosmain
com um tipo de retornovoid
; essa é provavelmente a regra mais frequentemente violada em relação àmain
função).Há duas declarações
main
que devem ser permitidas:Em (1) , não há parâmetros.
Em (2) , existem dois parâmetros e eles são nomeados convencionalmente
argc
eargv
, respectivamente.argv
é um ponteiro para uma matriz de seqüências de caracteres C representando os argumentos do programa.argc
é o número de argumentos naargv
matriz.Geralmente,
argv[0]
contém o nome do programa, mas esse nem sempre é o caso.argv[argc]
é garantido para ser um ponteiro nulo.Observe que, como um argumento do tipo array (como
char*[]
) é realmente apenas um argumento do tipo ponteiro disfarçado, as duas seguintes são maneiras válidas de escrever (2) e ambas significam exatamente a mesma coisa:Algumas implementações podem permitir outros tipos e números de parâmetros; você precisaria verificar a documentação da sua implementação para ver o que ela suporta.
main()
é esperado que retorne zero para indicar sucesso e diferente de zero para indicar falha. Não é necessário que você escreva explicitamente umareturn
declaraçãomain()
: se você deixarmain()
retornar sem umareturn
declaração explícita , será o mesmo que se você tivesse escritoreturn 0;
. As duasmain()
funções a seguir têm o mesmo comportamento:Existem duas macros
EXIT_SUCCESS
eEXIT_FAILURE
, definidas nela,<cstdlib>
também podem ser retornadasmain()
para indicar sucesso e falha, respectivamente.O valor retornado por
main()
é passado para aexit()
função, que finaliza o programa.Observe que tudo isso se aplica somente ao compilar para um ambiente hospedado (informalmente, um ambiente em que você tenha uma biblioteca padrão completa e um SO executando o seu programa). Também é possível compilar um programa C ++ para um ambiente independente (por exemplo, alguns tipos de sistemas incorporados), caso em que a inicialização e a finalização são totalmente definidas pela implementação e uma
main()
função pode nem ser necessária. Porém, se você estiver escrevendo C ++ para um sistema operacional de desktop moderno, estará compilando para um ambiente hospedado.fonte
Main
ser uma função membro estática porque nem sequer possui funções que não sejam membros. Até o C89 precisamain
retornarint
. Eu não estou suficientemente familiarizado com a K&R C para saber suas regras exatas, mas acho que também exigemain
retornar,int
poismain
sem tipo de retorno era algo comum e nenhum tipo = implícitoint
na K&R.int
.void
tipo de retorno como uma extensão de idioma . Os compiladores que não permitem isso incluem o GCC e o Comeau.Nos documentos padrão, 3.6.1.2 Função principal ,
int main() { / ... / }
eint main(int argc, char* argv[]) { / ... / }
Espero que ajude..
fonte
main
deve serint
?void
quebras esse modelo. Realmente nem faz sentido se você quer dizer "sempre considere o sucesso". Como você não tinha como dizer se o processo realmente falhou, você realmente conseguiu? Não retornoint
.A redação exata do último padrão publicado (C ++ 14) é:
Isso deixa claro que grafias alternativas são permitidas desde que o tipo de
main
seja o tipoint()
ouint(int, char**)
. Portanto, o seguinte também é permitido:int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(b d, a c)
fonte
int main(void)
não estava correta no C ++.auto main() -> int
não tem um tipo de retorno deduzido. Preste atenção ao {in "(auto main () {... não é permitido)" e aprenda a saber quando você ainda não sabe o suficiente para adicionar algo significativo.As duas redes válidas são
int main()
eint main(int, char*[])
. Qualquer outra coisa pode ou não ser compilada. Semain
não retornar explicitamente um valor, 0 será retornado implicitamente.fonte
main
ser nulo. Existe algum motivo específico para que o tipo de retorno principal seja int?int
tipo de retornomain
é que esse valor é entregue ao shell como o código de saída do programa esh
espera umint
.void
todos eles são silenciosos. Comint
nós temos que definir o valor de saída específico para cada retorno demain
.Detalhes sobre valores de retorno e seu significado
Conforme 3.6.1 (
[basic.start.main]
):O comportamento de
std::exit
é detalhado na seção 18.5 ([support.start.term]
) e descreve o código de status:fonte