69 votes

Pourquoi main () en C ++ ne peut pas être en ligne?

Je lisais la FAQ sur C ++ et j'ai remarqué une phrase.

main () ne peut pas être en ligne.

Pourquoi est-ce?

104voto

sepp2k Points 157757

En C ++, il n'est pas légal d'appeler la fonction principale dans votre code, il n'y aurait donc aucun moyen de l'insérer en ligne.

66voto

Parce que la norme dit:

[2003: 3.6.1/3]: La fonction principale ne doit pas être utilisé (3.2) à l'intérieur d'un programme. L' de liaison (3.5) de la mise en œuvre est définie. Un programme qui déclare principal pour être en ligne ou statique est mal formé. Le nom principal est pas autrement réservés. [Exemple: les fonctions de membres de, les classes et les les énumérations peuvent être appelées à main, comme des entités dans d'autres espaces de noms. ]

Et pourquoi faut-il le dire? Parce que c'est d'essayer de laisser autant sur la mise en œuvre de l' main à la personne .. ainsi, la mise en œuvre .. comme c'est possible, et ne veut pas limiter les implémentations en exigeant que l' inline valable quand il n'a pas d'intérêt pratique.


Mon ami le comité a confirmé ce:

Il n'y a aucune raison pourquoi une inline main() ne fonctionnerait pas, en soi. [..] Je pouvais avoir un C++ interprète qui peut appeler inline main(). [..] [Mais] inline/static main() sont interdits dans l'ordre, nous l'espérons, pour éviter la confusion. J'ai du mal à imaginer que la raison serait rien d'autre à ce qui a déjà été dit dans [ce Q&A].


BTW, ne confondez pas l' inline indicateur mot-clé à fait inline fonctions. Vous pouvez marquer une fonction inline et il ne peut pas être physiquement incorporé.

Donc, même si c'était vrai qu' main "ne peut pas être inline" (et strictement parlant, il n'est pas vrai, bien que l'in-lining main serait plutôt maladroit et inutile comme expliqué dans d'autres réponses), il pourrait théoriquement toujours en faveur de la inline indicateur mot-clé juste fine.

Il n'est pas pour la raison indiquée ci-dessus, et dans litb réponse: cela compliquerait les choses pour aucun avantage réel.

27voto

Ringding Points 2400

La bibliothèque d'exécution C doit trouver ce symbole pour "savoir" quelle fonction exécuter.

17voto

Karoly Horvath Points 45145

Vous ne pouvez pas appeler directement main () (c’est interdit en c ++), il est donc inutile de l’aligner.

14voto

iammilind Points 29275

Habituellement main() est appelé à partir de systèmes d' init() fonction. Ainsi, il est nécessaire qu'il peut y avoir exactement une définition pour main().

Maintenant, si nous le pouvons, inline le main() la fonction et de l'inclure dans un fichier d'en-tête, puis, pour chaque unité de traduction, il y aura des définitions différentes pour main(). Qui n'est pas autorisé. Vous pouvez déclarer main() en namespace et inline . Mais non global main().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X