Mouais, "ça compile" n'est pas une preuve que le programme soit correct. mainDOIT retourner un int. Point. C'est la norme qui le définit très clairement. Un programme C contenant un main ne retournant pas un entier est incorrect. (je crois qu'en C++ c'est possible, mais en tout cas pas en C).
Ce qui peut changer, ce sont les paramètres de main: soit int main(void)
si tu t'en fous des arguments, soit int main(int argc, char *argv[])
si tu en as besoin, soit int main ( /* autre chose */ )
si tu as envie d'utiliser des extensions fournies par ta plate-forme, mais non portables ("portable" au sens du C).
Les deux premières sont définies dans la norme, et fonctionneront sur toute implémentation du C (enfin, mis à part les cas des freestanding environments, mais on va passer pour l'instant); la troisième est implementation-defined et donc dépend de l'environnement. Par exemple, le int main(int argc, char *argv[] char *env[])
est une extension commune, qui compilera et fonctionnera sur certaines implémentations, mais n'est pas portable.
Cela dit, un compilateur C a le droit de rejeter un programme définissant main comme retournant void.
Et, en passant, pour compiler un programme C avec GCC, une ligne de commande pour avoir les bons avertissements est gcc -Wall [ -Wextra | -W ] [ -std=c99 [ -pedantic ]]
-Wextra est défini depuis la 4.0 je crois, avant c'était -W; et -std=c99 est utile (et même recommandé) pour s'assurer que ton code est correct au sens de la norme C99. Note que ce flag désactive certaines extensions (POSIX, GNU ou autres) qui entrent en conflit avec la norme, donc tu ne pourras pas forcément l'utiliser, suivant ce que tu veux faire. Le -pedantic retournant des avertissements supplémentaires de la norme, et rejete toute extension.
[^] # Re: 2 trucs :)
Posté par alf . En réponse au message gros débutant, problême pour compiler (gcc). Évalué à 0.
main DOIT retourner un int. Point. C'est la norme qui le définit très clairement. Un programme C contenant un main ne retournant pas un entier est incorrect. (je crois qu'en C++ c'est possible, mais en tout cas pas en C).
Ce qui peut changer, ce sont les paramètres de main: soit
int main(void)
si tu t'en fous des arguments, soit
int main(int argc, char *argv[])
si tu en as besoin, soit
int main ( /* autre chose */ )
si tu as envie d'utiliser des extensions fournies par ta plate-forme, mais non portables ("portable" au sens du C).
Les deux premières sont définies dans la norme, et fonctionneront sur toute implémentation du C (enfin, mis à part les cas des freestanding environments, mais on va passer pour l'instant); la troisième est implementation-defined et donc dépend de l'environnement. Par exemple, le
int main(int argc, char *argv[] char *env[])
est une extension commune, qui compilera et fonctionnera sur certaines implémentations, mais n'est pas portable.
Cela dit, un compilateur C a le droit de rejeter un programme définissant main comme retournant void.
Et, en passant, pour compiler un programme C avec GCC, une ligne de commande pour avoir les bons avertissements est
gcc -Wall [ -Wextra | -W ] [ -std=c99 [ -pedantic ]]
-Wextra est défini depuis la 4.0 je crois, avant c'était -W; et -std=c99 est utile (et même recommandé) pour s'assurer que ton code est correct au sens de la norme C99. Note que ce flag désactive certaines extensions (POSIX, GNU ou autres) qui entrent en conflit avec la norme, donc tu ne pourras pas forcément l'utiliser, suivant ce que tu veux faire. Le -pedantic retournant des avertissements supplémentaires de la norme, et rejete toute extension.