10
votes

déclarer correctement la fonction principale () dans l'ansi c

La norme C dit:

la fonction appelée au démarrage du programme est nommé principal. La mise en oeuvre déclare aucun prototype pour cela fonction. Il doit être défini avec un Type de retour de Int et sans Paramètres: P>

main()
{
  /* taram pampam ... */

  return 0;
}


0 commentaires

4 Réponses :


16
votes

Eh bien, si vous voulez des ansi c, alors par définition, la norme est correcte.

dans C89 / C90 Le type de retour int code> est impliqué, la définition K & R serait donc acceptable. p>

en C99, ce n'est plus le cas. P>

La norme C90 présente le libellé suivant (5.1.2.2.1 Démarrage du programme), qui est très similaire au libellé C99 (probablement le plus significatif Il utilise le moins fort «Can» au lieu de «doit»): P>

La fonction appelée au démarrage du programme est nommée principal code>. La mise en œuvre ne déclare aucun prototype pour cette fonction. Il peut être défini sans paramètres: P>

  extern int max(int a, int b)
  {
      return a > b ? a : b;
  }


4 commentaires

Oh, je ne savais pas la différence entre 99 et 89 ici, c'est peut-être la raison parce que je cite 99! Avez-vous la norme 89/90 et peut citer le parallèle parallèle à propos de celui-ci?


La norme C89 a déclaré beaucoup de même; Mais en C89, une fonction sans type de retour explicite a été implicitement supposée à renvoyer INT, de sorte que la forme int moins équivalente était équivalente.


@zaharpopov - J'ai ajouté des détails de l'ancien standard.


@Jonathanleffler merci. C'est genre de f'ed. De toute évidence, la langue devrait traiter une fonction sans type de retour explicite comme une erreur de programmeur, comme le fait de C99. Tant de décisions terribles de C ... voici une autre: golang.org/doc/articles/gos_declaration_syntax .html



4
votes

Oui, en C89 (la norme C originale C), si une fonction est déclarée sans type de retour, il est supposé renvoyer int . C99 nécessite un type de retour explicite sur toutes les fonctions.


3 commentaires

Mais leur définition n'a-t-elle pas violé la norme d'une certaine manière, de toute façon?


Non. Si vous impliquez un int, il correspond aux définitions acceptables de la principale.


Zaharpopov: Leur définition était légale (et l'autorité) à l'époque. C99 (qui est venu plus tard) interdit maintenant aux types de retour des intensions implicites.



3
votes

En outre, il y a une différence subtile (au moins dans les déclarations) entre les principaux () et le principal (void) - xxx pré>

est une fonction (implicitement) renvoyant int et prenant un Nombre non spécifié EM> Nombre d'arguments P>

main(void)


2 commentaires

Ce n'est que dans une déclaration - et je ne connais personne qui déclare principal (). Dans une définition, les deux sont équivalents, bien que la notation explicite «INT principale (VOID)» soit généralement le meilleur style C; En C ++, omettre le «void» est parfaitement acceptable.


J'ai modifié mon poste pour refléter cela. Bien que ce ne soit peut-être pas le cas en particulier spécifiquement, il convient de noter cela pour d'autres fonctions ...



0
votes

La version de K & R J'ai été imprimée en 1988. La norme n'était pas sortie. Il y a donc des incohérences. Cependant, la majeure partie de la 2e édition est conforme à la norme C89.

J'ai trouvé un texte version de la norme C89 (yay pour Google); Il dit: P>

"Démarrage du programme" p>

la fonction appelée au programme Le démarrage est nommé principal. Les La mise en œuvre ne déclare aucun prototype pour cette fonction. Il peut être défini sans paramètres: p>

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


1 commentaires

Je pense que K & R2 est sorti en 1988, pas seulement votre version.