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
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 no main
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 )
int
parámetro, invocas Comportamiento indefinido . Cualquier cosa puede pasar :)