web-dev-qa-db-fra.com

Pourquoi ne devrais-je pas #inclure <bits / stdc ++. H>?

J'ai posté une question avec mon code dont le seul #include La directive était la suivante:

#include <bits/stdc++.h>

Mon professeur m'a dit de le faire, mais dans la section commentaires, on m'a informé que je ne devrais pas.

Pourquoi?

190

Comprenant <bits/stdc++.h> semble être une chose de plus en plus courante à voir sur Stack Overflow, peut-être quelque chose de nouveau ajouté à un programme national au cours de l’année scolaire en cours.

J'imagine que les avantages sont vaguement donnés ainsi:

  • Vous n'avez besoin que d'écrire un #include ligne
  • Vous n'avez pas besoin de rechercher dans quel en-tête standard tout est

Malheureusement, il s’agit d’un hack paresseux, nommant directement un en-tête interne GCC au lieu d’en-têtes standards individuels comme <string>, <iostream> et <vector>. Cela ruine la portabilité et favorise de terribles habitudes.

Les inconvénients incluent:

  • Cela ne fonctionnera probablement que sur ce compilateur
  • Vous n'avez aucune idée de ce qu'il fera quand vous l'utiliserez, car son contenu n'est pas défini par une norme
  • Même en mettant à jour votre compilateur vers sa propre version suivante, votre programme risque d’être endommagé.
  • Chaque en-tête standard doit être analysé et compilé avec votre code source, ce qui est lent et donne lieu à un exécutable volumineux avec certains paramètres de compilation.

Ne le faites pas!


Plus d'information:

Exemple de pourquoi Quora est mauvais:

229

Pourquoi? Parce qu'il est utilisé comme s'il était supposé être un en-tête standard C++, mais aucun standard ne le mentionne. Donc, votre code est non-portable par construction. Vous ne trouverez aucune documentation à ce sujet sur cppreference . Donc, il pourrait aussi bien ne pas exister. C'est un produit de l'imagination de quelqu'un :)

26
Kuba Ober

Il existe un site Stack Exchange appelé Programming Puzzles & Code Golf . Les énigmes de programmation de ce site correspondent à cette définition de puzzle : "un jouet, un problème ou un autre dispositif conçu pour amuser présentant des difficultés à résoudre par l'ingéniosité ou un effort patient ". Ils sont conçus pour amuser, et non de la même manière qu'un programmeur qui travaille pourrait être amusé par un problème réel rencontré dans son travail quotidien.

Code Golf est "un type de compétition de programmation informatique récréative dans laquelle les participants s'efforcent d'obtenir le code source le plus court possible mettant en œuvre un algorithme donné". Dans les réponses du site PP & CG, vous verrez des personnes spécifier le nombre d'octets dans leurs réponses. Lorsqu'ils trouvent un moyen de supprimer quelques octets, ils suppriment le numéro d'origine et enregistrent le nouveau.

Comme vous vous en doutez, le golf de code récompense les abus extrêmes du langage de programmation. Noms de variables à une lettre. Aucun espace Utilisation créative des fonctions de la bibliothèque. Caractéristiques non documentées. Pratiques de programmation non standard. Hacks épouvantables.

Si un programmeur soumettait une demande de retrait au travail contenant un code de style golf, celle-ci serait rejetée. Leurs collègues se moqueraient d'eux. Leur responsable passerait à leur bureau pour bavarder. Même dans ce cas, les programmeurs s’amusent en soumettant des réponses à PP & CG.

Qu'est-ce que cela a à voir avec stdc ++. H? Comme d'autres l'ont souligné, l'utiliser est paresseux. Il n'est pas portable, vous ne savez donc pas si cela fonctionnera sur votre compilateur ou sur la prochaine version de votre compilateur. Cela favorise les mauvaises habitudes. C'est non standard, le comportement de votre programme peut donc différer de vos attentes. Cela peut augmenter le temps de compilation et la taille des exécutables.

Ce sont toutes des objections valides et correctes. Alors, pourquoi quelqu'un utiliserait-il cette monstruosité?

Il s'avère que certaines personnes aiment programmer des énigmes sans le code golf . Ils se réunissent et participent à des compétitions telles qu'ACM-ICPC, Google Code Jam et Facebook Hacker Cup ou sur des sites tels que Topcoder et Codeforces. Leur classement est basé sur l'exactitude du programme, la vitesse d'exécution et la rapidité avec laquelle ils soumettent une solution. Pour maximiser la vitesse d'exécution, de nombreux participants utilisent C++. Pour optimiser la vitesse de codage, certains d’entre eux utilisent stdc ++. H.

Est-ce une bonne idée? Vérifions la liste des inconvénients. Portabilité? Peu importe, car ces événements de codage utilisent une version spécifique du compilateur que les candidats connaissent à l’avance. Conformité aux normes? Non pertinent pour un bloc de code dont la durée de vie utile est inférieure à une heure. Temps de compilation et taille de l'exécutable? Ceux-ci ne font pas partie de la grille de notation du concours.

Donc nous nous retrouvons avec de mauvaises habitudes. Ceci est une objection valable. En utilisant ce fichier d’en-tête, les candidats évitent de savoir quel fichier d’en-tête standard définit les fonctionnalités qu’ils utilisent dans leur programme. Lorsqu'ils écrivent du code du monde réel (sans utiliser stdc ++. H), ils devront passer du temps à rechercher ces informations, ce qui signifie qu'ils seront moins productifs. C'est l'inconvénient de s'exercer avec stdc ++. H.

Cela soulève la question de savoir pourquoi il vaut la peine de prendre part à une programmation concurrentielle, si cela encourage les mauvaises habitudes, telles que l’utilisation de stdc ++. H et la violation d’autres normes de codage. Une réponse est que les gens le font pour la même raison qu’ils postent des programmes sur PP & CG: certains programmeurs trouvent qu’il est agréable d’utiliser leurs compétences de codage dans un contexte de jeu.

La question de l’utilisation de stdc ++. H revient donc à savoir si les avantages de la vitesse de codage dans un concours de programmation l’emportent sur les mauvaises habitudes qu’on pourrait développer en l’utilisant.

Cette question demande: "Pourquoi ne devrais-je pas #include <bits/stdc++.h>? "Je me rends compte qu’il a été demandé et répondu de faire une remarque, et la réponse acceptée est censée être la seule réponse vraie à cette question. Mais la question n’est pas" Pourquoi ne devrais-je pas inclure #include <bits/stdc++.h> dans le code de production? "Par conséquent, j'estime qu'il est raisonnable d'envisager d'autres scénarios dans lesquels la réponse peut être différente.

11
RedGreenCode