Recentemente, tive que digitar um pequeno programa de teste C e, no processo, cometi um erro de ortografia na função principal usando acidentalmente em vooid
vez de void
.
E ainda assim funcionou.
Reduzindo-o para a menor versão completa, acabei com:
int main (vooid) {
return 42;
}
Isso de fato compila ( gcc -Wall -o myprog myprog.c
) e, quando executado, retorna 42.
Como exatamente esse código é válido?
Aqui está uma transcrição recortada e colada do meu bash
shell para mostrar o que estou fazendo:
pax$ cat qq.c
int main (vooid) {
return 42;
}
pax$ rm qq ; gcc -Wall -o qq qq.c ; ./qq
pax$ echo $?
42
main
desde as duas canônicas padrão. Para portabilidade, você deve usar um desses dois, mas acho que o UB não se aplica aqui.
main
deve ter uma das 2 formas canônicas (2.1.2.2). Mas você está certo @pax, em um ambiente independente, o identificador não main
é de forma alguma especial: se usado como uma função, pode ser de qualquer tipo e ter qualquer número de parâmetros de qualquer tipo.
int main (int argc, char *argv[], char *envp[]);
estivesse em conformidade )
int
parâmetro, você invoca o comportamento indefinido . Qualquer coisa pode acontecer :)