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 vooidvez 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 bashshell 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
maindesde as duas canônicas padrão. Para portabilidade, você deve usar um desses dois, mas acho que o UB não se aplica aqui.
maindeve 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 )
intparâmetro, você invoca o comportamento indefinido . Qualquer coisa pode acontecer :)