paulo1205
(usa Ubuntu)
Enviado em 20/03/2020 - 10:03h
perfection escreveu:
Minha dúvida está em declarar ou não return 0;
Entendi que o main é uma função que dá um return e que 0 seria executado com sucesso? (Corrijam-me se eu estiver errado)
Ai compilar da forma abaixo o compilador reclama da falta de return 0;
gcc Test2.c -o Test2 -Wall -O2 -pedantic -ansi -Werror -pedantic-errors
error: control reaches end of non-void function [-Werror=return-type]
Compreendo que consigo usar sem declarar return porém quero saber se é certo ou não.
Quando você colocou a opçao “
-ansi”, você explicitamente solicitou ao GCC que use as regras definidas pelo padrão do C que foi promulgado pela ANSI (Instituto de Padrões Nacionais Americanos) em 1989, também conhecido como C89. Essa versão do C exigia que todas as funções declaradas com tipo de retorno diferente de
void deveriam explicitamente retornar um valor desse tipo (ou conversível para tal tipo).
Versões posteriores do padrão do C, tal como o de 1999 (C99) e o de 2011 (C11) (e, antes deles, também o C++ com o padrão de 1998 (C++98)), passaram a ter uma regra especial e diferenciada para a função
main(), permitindo-lhe omitir o comando
return ou a invocação de
exit() explícitos, especificando que, nesse caso, o comportamento deveria ser equivalente à presença de um comando “
return 0;” como último comando da função.
Você, então, pode, ao compilar seu programa, substituir a opção “
-ansi” por outra, que lhe permita selecionar uma versão mais moderna do padrão (por exemplo: “
-std=c99” para usar as regras do C99 ou “
-std=gnu11” para usar as regras do C11 mais as extensões GNU), e isso será suficiente para não exigir a presença de um
return ou
exit() explícito antes do fim de
main().
(Em tempo: note que eu falo de “comando
return” e “invocação de
exit()”, não de “declaração”. No contexto do C, uma declaração é o momento em que um novo símbolo, seja ele função ou variável, é apresentado ao programa, juntamente com a especificação do seu tipo de dados. Usar a terminologia de modo correto ajuda a comunicação.)
P.S. Não que minha opinião pessoal faça alguma diferença, mas, na minha cabeça de engenheiro, as exceções introduzidas nos padrões de 1999 do C e no do C++ de 1998 criaram, em nome da conveniência, uma anomalia. No padrão de 1989/1990, a ideia parecia ser a de realçar que
main() é uma função como outra qualquer -- até porque ela de fato é uma função como qualquer outra em todos os outros aspectos, exceto pelo fato de ser a primeira função chamada pelo ambiente de execução. Ao criar uma regra excepcional para
main(), acaba se complicando a construção do compilador e, de certa forma, criando uma brecha para dúvida, sobretudo na cabeça do aluno iniciante, que vê duas coisas com aspecto semelhante mas comportamentos diferentes.
... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)