Hace poco tuve que escribir un pequeño programa de prueba C y, en el proceso, cometí un error ortográfico en la función principal al usar accidentalmente vooid
en lugar de void
."int main (vooid)"? ¿Cómo funciona?
Y aún así funcionó.
La reducción se reduce a su más pequeña versión completa, que terminó con:
int main (vooid) {
return 42;
}
Esto hecho de compilación (gcc -Wall -o myprog myprog.c
) y, cuando se ejecuta, devuelve 42.
¿Cómo es exactamente este código válido?
Aquí hay un corte de transcripción y pegado de mi concha bash
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
Al definir main con un solo parámetro 'int', invoca ** Comportamiento no definido **. Todo puede pasar :) – pmg
En realidad, no estoy seguro sobre el UB, @pmg. ISO específicamente permite otras posibilidades de 'main' a partir de las dos estándar canónicas. Para la portabilidad, debe usar uno de esos dos, pero no creo que UB aplique aquí. – paxdiablo
Hmm: en un entorno alojado 'main' debe tener una de las 2 formas canónicas (2.1.2.2). Pero tiene razón @pax, en un entorno autónomo, el identificador 'main' no es de ninguna manera especial: si se usa como función, puede ser de cualquier tipo y tener cualquier cantidad de parámetros de cualquier tipo. – pmg