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
int
parâmetro, você invoca o comportamento indefinido . Qualquer coisa pode acontecer :)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ãomain
é 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 )Respostas:
É simplesmente usar a sintaxe de declaração de função "estilo antigo"; você está declarando implicitamente um
int
parâmetro chamadovooid
.fonte
-std=c99
, eu entendoqq.c:1: warning: type of 'vooid' defaults to 'int'
.É um código válido, porque myprog.c contém:
vooid
contém um mais o número de argumentos passados (ou seja,argc
). Então, na verdade tudo o que tenho feito é mudar o nomeargc
paravooid
.fonte
Em C, o tipo padrão para um argumento de função é
int
. Portanto, seu programa está tratando a palavravooid
comoint main(int vooid)
, que é um código perfeitamente válido.fonte
É apenas
gcc -std=c89 -Wall -o qq qq.c
egcc -std=gnu89 -Wall -o qq qq.c
não emite um aviso. Todos os outros padrões emitem um aviso sobre o tipo implícitoint
paravooid
.int main(chart)
se comporta da mesma maneira que fazint main (vooid)
.return vooid;
retorna o número de argumentos da linha de comando.Testei com o gcc 4.4.5 no sistema de teste Debian.
fonte