En C: Différence entre main () et int main ()

Dupliquer possible:
différence entre main (void) et main () en c

Je sais que ceci est super basique et quelques autres discussions ont déjà parlé de questions similaires. Mais j’ai un livre (Guide absolu pour débutants en C) où tout le code est écrit dans la fonction main (). Le int est toujours laissé de côté. Comment est-ce possible de courir? Est-ce que ça va avec peut-être une ancienne version de stdio.h?
Voici l exemple de code:

#include  main() // not int main() { printf("This is it\n"); return 0; } 

Je pense que la norme c89 autorisera main (), mais pas c99. Sinon, vous devez utiliser int main () .

main() fonctionne mais est déroutant. En C, la fonction main renvoie toujours un entier pour spécifier le statut de sortie. La syntaxe correcte est donc int main() , mais les bons livres C auront toujours int main() .

Ce type de questions dépend fortement de la version standard, donc une réponse générale n’a pas beaucoup de sens.

D’après un brouillon C89 (corrigez-moi si la norme officielle C89 est différente, ce n’est pas librement disponible):

La fonction appelée au démarrage du programme s’appelle main. L’implémentation ne déclare aucun prototype pour cette fonction. Il peut être défini sans paramètre:

int main(void) { /*...*/ }

ou avec deux parameters (appelés ici argc et argv, bien que tous les noms puissent être utilisés, car ils sont locaux à la fonction dans laquelle ils sont déclarés):

int main(int argc, char *argv[]) { /*...*/ }

C99 et C11 standard disent la même chose, mais ils ajoutent quelque chose au et:

[…]

ou équivalent [9] ou d’une autre manière définie par la mise en œuvre.

[9] Ainsi, int peut être remplacé par un nom typedef défini comme int, ou le type argv peut être écrit char ** argv, et ainsi de suite.

En général, les éléments non définis dans la norme entraînent un comportement indéfini, de sorte que le code est UB dans C89 / C90 et qu’il peut être valide dans C99 et C11, mais que cela est défini par l’implémentation.

PS: comme vous pouvez le constater, vous devez également append void dans la liste des parameters, sans quoi le comportement est défini comme ci-dessus.