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

Aug 05 2015

J'ai posté une question avec mon code dont la seule #includedirective était la suivante:

#include <bits/stdc++.h>

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

Pourquoi?

Réponses

349 LightnessRacesinOrbit Aug 05 2015 at 00:57

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

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

  • Vous n'avez besoin d'écrire qu'une seule #includeligne
  • Vous n'avez pas besoin de rechercher dans quel en-tête standard tout se trouve

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

Les inconvénients comprennent:

  • Cela ne fonctionnera probablement que sur ce compilateur
  • Vous n'avez aucune idée de ce qu'il fera lorsque vous l'utiliserez, car son contenu n'est pas défini par une norme
  • Même la simple mise à niveau de votre compilateur vers sa propre version suivante peut casser votre programme
  • Chaque en-tête standard doit être analysé et compilé avec votre code source, ce qui est lent et se traduit par un exécutable volumineux sous certains paramètres de compilation

Ne fais pas ça!


Plus d'information:

Exemple de pourquoi Quora est mauvais:

67 UnslanderMonica Aug 06 2015 at 23:50

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

J'ai découvert - à ma grande horreur et incrédulité - qu'il existe un site de didacticiels bien connu où chaque exemple C ++ semble inclure cet en-tête . Le monde est fou. Voilà la preuve.


À quiconque écrit de tels "tutoriels"

Veuillez arrêter d'utiliser cet en-tête. Oublie ça. Ne propagez pas cette folie. Si vous ne voulez pas comprendre pourquoi faire cela est faux , croyez-moi sur parole. Je ne suis pas d'accord pour être traité comme une figure d'autorité sur quoi que ce soit, et j'en suis probablement plein la moitié du temps, mais je ferai une exception dans ce seul cas. Je prétends savoir de quoi je parle ici. Prenez-moi sur parole. Je vous en supplie.

PS Je peux bien imaginer l'abominable "norme d'enseignement" où cette idée méchante aurait pu avoir lieu, et les circonstances qui y ont conduit. Ce n'est pas parce qu'il semblait y avoir un besoin pratique que cela le rend acceptable - même pas rétrospectivement.

PPS Non, il n'y avait aucun besoin pratique. Il n'y a pas beaucoup d'en-têtes standard C ++ et ils sont bien documentés. Si vous enseignez, vous ne rendez pas service à vos étudiants en ajoutant une telle «magie». Produire des programmeurs avec un état d'esprit magique est la dernière chose que nous voulons. Si vous avez besoin d'offrir aux étudiants un sous-ensemble de C ++ pour leur faciliter la vie, il vous suffit de produire un document contenant la courte liste d'en-têtes applicables au cours que vous enseignez et une documentation concise sur les constructions de bibliothèque que vous attendez des étudiants.

45 RedGreenCode Apr 23 2019 at 08:09

Il existe un site d'échange de piles appelé Programming Puzzles & Code Golf . Les puzzles de programmation sur ce site correspondent à cette définition de puzzle :

un jouet, un problème ou un autre artifice conçu pour amuser en présentant des difficultés à résoudre par l'ingéniosité ou l'effort du patient.

Ils sont conçus pour amuser, et non de la manière dont un programmeur en activité pourrait être amusé par un problème du monde 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 qui implémente un certain algorithme». Dans les réponses sur le site PP&CG, vous verrez des gens spécifier le nombre d'octets dans leurs réponses. Lorsqu'ils trouvent un moyen de raser quelques octets, ils rayeront le numéro d'origine et enregistreront le nouveau.

Comme vous pouvez vous en douter, le code de golf récompense les abus extrêmes du langage de programmation. Noms de variables à une lettre. Pas d'espace blanc. Utilisation créative des fonctions de la bibliothèque. Fonctionnalités non documentées. Pratiques de programmation non standard. Des hacks épouvantables.

Si un programmeur soumettait une demande d'extraction au travail contenant du code de style golf, elle serait rejetée. Leurs collègues se moquaient d'eux. Leur responsable passait à leur bureau pour discuter. Même ainsi, les programmeurs s'amusent en soumettant des réponses à PP&CG.

Qu'est-ce que cela a à voir stdc++.h? Comme d'autres l'ont souligné, son utilisation est paresseuse. Il n'est pas portable, vous ne savez donc pas si cela fonctionnera sur votre compilateur ou la prochaine version de votre compilateur. Cela favorise les mauvaises habitudes. Ce n'est pas standard, donc le comportement de votre programme peut différer de ce que vous attendez. Cela peut augmenter le temps de compilation et la taille de l'exécutable.

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

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

Est-ce une bonne idée? Vérifions la liste des inconvénients. Portabilité? Cela n'a pas d'importance puisque ces événements de codage utilisent une version de compilateur spécifique que les concurrents 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 rubrique de notation du concours.

Nous nous retrouvons donc avec de mauvaises habitudes. C'est une objection valable. En utilisant ce fichier d'en-tête, les candidats évitent la chance d'apprendre quel fichier d'en-tête standard définit la fonctionnalité qu'ils utilisent dans leur programme. Lorsqu'ils écrivent du code réel (et ne l'utilisent pas 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'entraîner avec stdc++.h.

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

La question de savoir s'il faut utiliser stdc++.hse résume donc à savoir si les avantages de la vitesse de codage dans un concours de programmation l'emportent sur les mauvaises habitudes que l'on pourrait développer en l'utilisant.

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

12 Bulletmagnet Nov 03 2019 at 18:39

À partir de N4606, brouillon de travail, norme pour le langage de programmation C ++:

17.6.1.2 En-têtes [en-têtes]

  1. Chaque élément de la bibliothèque standard C ++ est déclaré ou défini (selon le cas) dans un en-tête.

  2. La bibliothèque standard C ++ fournit 61 en-têtes de bibliothèque C ++, comme indiqué dans le tableau 14.

Tableau 14 - En-têtes de bibliothèque C ++

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

Il n'y a pas de <bits / stdc ++. H> ici. Ce n'est pas surprenant, car les en-têtes <bits / ...> sont des détails d'implémentation et portent généralement un avertissement:

*  This is an internal header file, included by other library headers.
*  Do not attempt to use it directly. 

<bits / stdc ++. h> comporte également un avertissement:

*  This is an implementation file for a precompiled header.
2 YunfeiChen Jul 08 2020 at 07:20

La raison pour laquelle nous n'utilisons pas:

#include <bits/stdc++.h>

est à cause de l'efficacité. Permettez-moi de faire une analogie: pour ceux d'entre vous qui connaissent Java: si vous avez demandé à votre instructeur si ce qui suit était une bonne idée, à moins qu'ils ne soient un mauvais instructeur, ils diront non:

import java.*.*

La chose #include ... fait la même chose en gros ... Ce n'est pas la seule raison pour ne pas l'utiliser, mais c'est l'une des principales raisons de ne pas l'utiliser. Pour une analogie réelle: imaginez que vous aviez une bibliothèque et que vous vouliez emprunter quelques livres à la bibliothèque, déménageriez-vous toute la bibliothèque à côté de votre maison? Ce serait coûteux et inefficace. Si vous n'avez besoin que de 5 livres, eh bien n'en prenez que 5 ... Pas toute la bibliothèque .....

#include <bits/stdc++.h>

Cela semble convenir au programme. Je n'ai besoin de taper qu'une instruction d'inclusion et cela fonctionne, même chose avec le déplacement d'une bibliothèque entière, regardez je n'ai besoin de déplacer qu'une bibliothèque entière au lieu de 5 livres, un par un. Cela vous semble pratique, c'est-à-dire pour la personne qui doit réellement faire le déménagement ?? Pas tellement, et devinez ce qu'en C ++ la personne effectuant le déplacement sera votre ordinateur ... L'ordinateur n'appréciera pas de déplacer la bibliothèque entière pour chaque fichier source que vous écrivez:) .....