10
votes

L'utilisation de la principale sans type de retour est-elle mise en phase dans C ++ 11?

Stephen Prata dans son livre C ++ Primer Plus [P 31] dit:

De nombreux programmes existants utilisent la fonction de fonction C classique C à la place:


Main () // Style C original

Sous Classic C, omission du type de retour est la même chose que dire que la fonction est de type int. Cependant, c ++ a éliminé cette utilisation.

Cependant, le projet 3.6.1-> 2 de C ++ 11 dit

Une implémentation ne doit pas prédéfinir la fonction principale. Cette fonction ne doit pas être surchargé. Il doit avoir un type de retour de type INT, mais Sinon, son type est défini par la mise en œuvre.

résultat du test xxx

confirme que ce que M. Prata a dit est vrai en ce qui concerne la norme C ++.

Y a-t-il une clause dans le brouillon C ++ 11 qui décourage l'utilisation de: xxx

est

Il doit avoir un type de retour de type INT

elle-même une telle clause?


4 commentaires

@Jonathanleffler: Je supposerais que beaucoup de mise en œuvre n'a pas suivi l'obligation de maintenir la compatibilité avec les programmes de l'OLD C.


Main () {} est banni par les règles régissant les déclarations. Voir [DCL.TYPE] / 3 et [DCL.DCL] / 11 . Un libellé similaire peut être trouvé dans chaque norme publiée.


ISO / CEI 14882: 1998 Contient: §7 Déclarations ¶7 uniquement dans les déclarations de fonction pour les constructeurs, les destructeurs et les conversions de type peut le déclin-spécificateur-SEQ être omis.78) - et la note de bas de page 78 dit la règle "Implicit int" de C n'est plus prise en charge. donc, principal () déclaré sans le type de retour n'a jamais fait partie de la norme C ++, mais il a été laissé à peu près jusqu'à la création de la norme C ++ 98 (et probablement un peu plus longtemps pour des raisons de compatibilité à l'envers).


@Jonathanleffler: Merci. Il est clair maintenant ..


4 Réponses :


2
votes

Il n'est pas requis par la norme pour le pour revenir explicitement. Si Retour est manquante, le compilateur met simplement:

retour 0;

à la fin. Cette règle ne s'applique pas à d'autres fonctions.

in c, type de retour par défaut de toute fonction était int si non fourni par programmeur, par exemple: xxx

c ++ La norme nécessite que vous ne devez spécifier le type de retour. Le code ci-dessus ne compilera pas au compilateur C ++. C90 autorisé implicite int , C99 désalcule implicite int .


5 commentaires

Par by c ++ ne le permet pas avez-vous voulu dire que la norme ne le permet pas. Quelques implémentations, disent g ++ le permettent ..


Oui, la norme C ++ nécessite un type explicite à donner.


Je pense que dire que C ++ ne le permet pas est suffisamment clair, personne ne fait référence à une implémentation spécifique de la norme C ++ quand elles disent "C ++"


@ XBOI209: Mais il vaut mieux dire quelle standard. Dire C ++ n'est pas assez clair.


En fait, "standard c ++" est suffisamment clair; Cela signifie C ++ 98, C ++ 03, C ++ 11, C ++ 14, tous les interdisez (et il n'y a aucune raison de penser que toute version future de C ++ le permettra).



3
votes

Ce est ce que le brouillon de travail indique à propos de la fonction principale.
Extraits suivent.

  • 3.6.1 / 2

    Une implémentation ne doit pas prédéfinir la fonction principale. Cette fonction ne doit pas être surchargée. Son type doit avoir une liaison de langue C ++ et il doit avoir un type de retour déclaré de type INT, mais sinon son type est défini par la mise en œuvre. Une implémentation doit permettre à la fois

    • une fonction de () renvoyer int et
    • une fonction de (int, pointeur au pointeur à char) renvoyer int

      comme type de principal

      • 3.6.1 / 5 :

        Une déclaration de retour dans la principale a pour effet de laisser la fonction principale [...] si le contrôle s'écoule de la fin de l'instruction Composé de la principale, l'effet est équivalent à un retour avec l'opérande 0

        Donc, la norme indique que la fonction principale doit avoir l'un des types suivants:

        • int ()

        • int (int, char * **)

          Être la fonction principale Une fonction, je suppose qu'il suit également les règles de 8.3.5 .
          La question deviendrait donc: puis-je omettre le type de retour d'une définition de la fonction? La norme me permet-elle de le faire?
          La réponse est non, en effet.


8 commentaires

C'est la seule réponse, répondant vraiment à la question. Aucune des autres réponses ne répond à la demande de preuve de la norme.


@exilit: Malheureusement, cela ne traite pas de la question, cependant: la question concerne la Déclaration et pas à propos de la déclaration moins comme écrit.


@exilit sauf les citations de la norme ici ne répondent pas à la question. La question concerne le type de retour implicite int .


@ Dietmarkühl et cette réponse ne concerne pas la déclaration également. Il s'agit du type de retour. Ce qui fait certainement partie de la déclaration, non?


@ Dietymarkühl en fait, la réponse concerne à la fois la déclaration de retour et le type de retour. Quoi qu'il en soit, merci pour le commentaire. Je suppose que la réponse acceptée est bien meilleure et j'ai voté. :-)


@exilit Il n'y a rien dans les citations de cette réponse qui stipule qu'il n'y a pas de type implicite int de type de retour, qui était le point de la question.


@juanchopanza en tant que Skypjack a déclaré que la réponse acceptée est beaucoup plus claire. À l'heure, commentant cette autre réponse n'existait pas et je ne m'attendais pas à ce que cette déclaration précise n'existe pas dans la norme. Mais néanmoins, cette réponse contient deux citations plus une troisième référence que le répondeur a utilisé pour conclure sa déclaration.


@exilit Il y avait au moins une meilleure réponse lorsque vous avez posté votre commentaire (sinon je n'aurais pas commenter moi-même.) Plus je ne vois pas comment un certain nombre de citations largement non pertinentes de la norme "traitent de la demande d'une preuve dans le la norme".



8
votes

Les types INT ont été interdits dans toutes les normes C ++, c'est-à-dire qu'il n'était pas autorisé en C ++ 98. Ce n'est rien de nouveau dans C ++ 11. Il n'y avait aucune exception pour principal () en ce qui concerne la déclaration de la fonction. En outre, la règle implicite int appliqué à toutes les déclarations non seulement pour Main () .

La clause pertinente de la norme C ++ est 7 [DCL.DCL] Paragraphe 11:

uniquement dans les déclarations de fonction pour les constructeurs, les destructeurs et les conversions de type peuvent le déclin-spécificateur-SEQ être omis. 94

94) La règle "Implicit Int" de C n'est plus supportée.

Je n'ai pas accès facile à la norme C ++ 98 en ce moment mais C ++ 03 a définitivement la même déclaration. La seule différence est que c'est au paragraphe 7 et la note de bas de page est " 79 " au lieu de " 94 ". ".

C implicite INT est une partie de C ++ pendant un certain temps avant la première norme mais a été supprimée à un moment donné. Les compilateurs peuvent accepter des programmes omettant le type comme une extension, mais je pense qu'ils sont tenus d'émettre un diagnostic. Si cela signifie que beaucoup est une question distincte car il est établi longtemps que l'écriture d'un seul \ r au début d'une ligne répondrait à cette exigence.

Qu'est-ce qu'il y a et ce qui restera est l'exception étrange que l'exécution du programme peut circuler de la fin de principale () sans retour Déclaration: on suppose que mandater une instruction dans principal () enfreindrait le code existant.

la déclaration

Il doit avoir un type de retour de type int

n'indique rien sur la manière dont la fonction acquiert son type de retour. Il n'impose que ce que le type de retour sera.


2 commentaires

Merci, mais je pense que les compilateurs ne sont pas tenus d'émettre un diagnostic. Par exemple, g ++ ne va pas


@sjsam je pense aussi aussi.



22
votes

Voir aussi quel devrait principal () retourner dans C et C ++?

ISO / CEI 14882: 1998 contient:

§7 Déclarations

¶7 uniquement dans les déclarations de fonctions pour les constructeurs, les destructeurs et les conversions de type peuvent le déclin-spécificateur-SEQ être omis. 78)

et note de bas de page 78 dit:

La règle "Implicit Int" de C n'est plus supportée.

Les mêmes déclarations sont dans ¶9 et note de bas de page 89 dans la norme C ++ 11.

donc, principal () déclaré sans le type de retour n'a jamais fait partie de la norme C ++, mais elle a été laissée à peu près jusqu'à la création de la norme C ++ 98 (et probablement un peu plus longtemps pour raisons de compatibilité à l'envers).

Si vous regardez dans la "conception et évolution de C ++" de Stroustrup (publié 1994), §2.8 La syntaxe de déclaration C dit:

Autoriser le spécificateur de type omis (signification int par défaut) a également conduit à des complications. ... La réaction négative aux changements dans cette zone des utilisateurs était très forte. ... J'ai soutenu le changement. Je ne pense pas avoir eu un choix. Permettre à cet implicite int est la source de nombreux problèmes ennuyeux avec la grammaire C ++ aujourd'hui. ... Enfin, dix ans plus tard, le Comité standard de l'ANSI / ISO C ++ a décidé de se déprécier int . Cela signifie que nous pouvons vous en débarrasser dans une autre décennie.


0 commentaires