A mainfunçã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 mainnão está reservado no C ++, exceto como uma função no espaço para nome global. Você pode declarar outras entidades nomeadas main, 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 maincomo uma função membro ou em um espaço para nome, mas essa função não seria a mainfunção que designa onde o programa é iniciado.
A mainfunção não pode ser declarada como staticou inline. Também não pode ser sobrecarregado; pode haver apenas uma função nomeada mainno espaço para nome global.
A mainfunção não pode ser usada no seu programa: você não pode chamar a mainfunção de qualquer lugar do seu código, nem o endereço dele.
O tipo de retorno de maindeve serint . Nenhum outro tipo de retorno é permitido (esta regra está em negrito porque é muito comum ver programas incorretos que são declarados maincom um tipo de retorno void; essa é provavelmente a regra mais frequentemente violada em relação à mainfunção).
Há duas declarações mainque devem ser permitidas:
int main() // (1)
int main(int, char*[]) // (2)
Em (1) , não há parâmetros.
Em (2) , existem dois parâmetros e eles são nomeados convencionalmente argce argv, respectivamente. argvé um ponteiro para uma matriz de seqüências de caracteres C representando os argumentos do programa. argcé o número de argumentos na argvmatriz.
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:
int main(int argc, char* argv[])
int main(int argc, char** argv)
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 uma returndeclaração main(): se você deixar main()retornar sem uma returndeclaração explícita , será o mesmo que se você tivesse escrito return 0;. As duas main()funções a seguir têm o mesmo comportamento:
int main() { }
int main() { return 0; }
Existem duas macros EXIT_SUCCESSe EXIT_FAILURE, definidas nela, <cstdlib>também podem ser retornadas main()para indicar sucesso e falha, respectivamente.
O valor retornado por main()é passado para a exit()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.
mainretornar em C e C ++ .