Recientemente tuve que escribir un pequeño programa de prueba C y, en el proceso, cometí un error de ortografía en la función principal al usar accidentalmente en vooid
lugar de void
.
Y aún así funcionó.
Reduciéndolo a su versión completa más pequeña, terminé con:
int main (vooid) {
return 42;
}
De hecho, esto compila ( gcc -Wall -o myprog myprog.c
) y, cuando se ejecuta, devuelve 42.
¿Cómo es exactamente este código válido?
Aquí hay una transcripción cortada y pegada de mi bash
shell para mostrar lo que estoy haciendo:
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, invocas Comportamiento indefinido . Cualquier cosa puede pasar :)main
los dos estándares canónicos. Para la portabilidad, debe usar uno de esos dos, pero no creo que UB se aplique aquí.main
debe tener una de las 2 formas canónicas (2.1.2.2). Pero tiene razón @pax, en un entorno independiente, el identificador nomain
es de ninguna manera especial: si se usa como una función, puede ser de cualquier tipo y tener cualquier número de parámetros de cualquier tipo.int main (int argc, char *argv[], char *envp[]);
se ajuste )Respuestas:
Simplemente está usando la sintaxis de declaración de función "estilo antiguo"; estás declarando implícitamente un
int
parámetro llamadovooid
.fuente
-std=c99
, obtengoqq.c:1: warning: type of 'vooid' defaults to 'int'
.Es un código válido, porque myprog.c contiene:
vooid
contiene uno más el número de argumentos pasados (es decir,argc
). Así que, en efecto, todo lo que hemos hecho es cambiar el nombreargc
avooid
.fuente
En C, el tipo predeterminado para un argumento de función es
int
. Entonces, su programa trata la palabravooid
comoint main(int vooid)
, que es un código perfectamente válido.fuente
Es único
gcc -std=c89 -Wall -o qq qq.c
ygcc -std=gnu89 -Wall -o qq qq.c
no emite una advertencia. Todos los demás estándares emiten una advertencia sobre el tipo implícitoint
paravooid
.int main(chart)
se comporta de la misma manera que lo haceint main (vooid)
.return vooid;
devuelve el número de argumentos de línea de comando.Probé con gcc 4.4.5 en el sistema de prueba de Debian.
fuente