“Int main (vooid)”? ¿Cómo funciona?

Hace poco tuve que escribir un pequeño progtwig de prueba de C y, en el proceso, cometí un error de ortografía en la función principal utilizando accidentalmente vooid lugar de void .

Y sin embargo todavía funcionaba.

Al reducirlo a su versión completa más pequeña, terminé con:

 int main (vooid) { return 42; } 

Esto sí comstack ( 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 desde mi shell 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 

Simplemente está usando la syntax de statement de función de “estilo antiguo”; Usted está declarando implícitamente un parámetro int llamado vooid .

Es un código válido, porque myprog.c contiene:

 int main (vooid) // vooid is of type int, allowed, and an alias for argc { return 42; // The answer to the Ultimate Question } 

vooid contiene uno más el número de argumentos pasados ​​(es decir, argc ). Entonces, en efecto, todo lo que has hecho es cambiar el nombre de argc a vooid .

En C, el tipo predeterminado para un argumento de función es int . Entonces, su progtwig trata la palabra vooid como int main(int vooid) , que es un código perfectamente válido.

Es solo gcc -std=c89 -Wall -o qq qq.c y gcc -std=gnu89 -Wall -o qq qq.c no emiten una advertencia. Todos los demás estándares emiten una advertencia sobre el tipo implícito int para vooid .

int main(chart) comporta de la misma manera que int 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 pruebas Debian.