Pourquoi devrais-je pas #include <bits/stdc++.h>?
J'ai posté une question avec mon code, dont le seul #include
directive était le suivant:
#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?
- Hein. J'aurais du me douter qu'il y aurait un inclure la version de
using namespace std;
là, quelque part. - pourquoi cette tête de même exister? assurément, c'est de la norme inclut comprennent, en fait, puisque cela permettrait d'apporter beaucoup d'ordure? et si ce n'est pas compris par tout le public comprend... alors pourquoi est-il livré dans la distribution?
- C'est un détail d'implémentation. Il ne fait pas partie de la "API publique" ou destinées à l'utilisation. Mais il a encore à être expédiés sinon rien ne fonctionne. La norme comprend peut pas l'utiliser individuellement, mais il est là pour une utilisation dans les en-têtes précompilés. Voir le commentaire en haut, qui dit: "Ceci est un fichier de mise en oeuvre pour un en-tête précompilé.".
- Si vous n'êtes pas censé l'utiliser vous-même, comment son existence à aider avec la PCH? Ou est gcc assez intelligent pour passer automatiquement de l'un à l'autre pour PCH fins dans certaines circonstances?
- Bonne question. Euh, je ne sais pas vraiment, mais c'est probablement ce que je pensais oui. Peut-être une bonne question dans son propre droit.
- "Il ne fait pas partie de la "API publique" ou destinées à l'utilisation." Tout à fait tort, il est destiné à l'usage public, comme un en-tête précompilé. Libstdc++ (pré)compile et installe une version compilée de cet en-tête, donc si vous l'incluez alors G++ incluent
bits/stdc++.h.gch
au lieu de cela, la version compilée. Il existe parce qu'il a d'exister, de sorte que la version compilée de ce fichier peut être généré. - L'API publique de la bibliothèque standard, je veux dire; pas de libstdc++. Les gens de l'utiliser sur un Débordement de Pile tous les jours (et dans leurs projets) ne sont pas de l'utiliser pour la raison, ou, dans le cas d'utilisation, que vous êtes en train de parler. Bien sûr, mon commentaire a été formulé avec plus de précision, mais notez que je n'ai point de son utilisation pour les en-têtes précompilés. N'hésitez pas à écrire une autre réponse.
Vous devez vous connecter pour publier un commentaire.
Y compris
<bits/stdc++.h>
semble être de plus en plus fréquent de voir sur un Débordement de Pile, peut-être quelque chose vient d'être ajouté à un programme national dans le courant de l'année académique.J'imagine que les avantages sont vaguement donné ainsi:
#include
ligneMalheureusement, c'est un paresseux hack, de nommer un GCC interne de l'en-tête directement à la place de l'individu en-têtes standard comme
<string>
,<iostream>
et<vector>
. Il ruine la portabilité et favorise les habitudes terrible.Les inconvénients comprennent:
Ne pas le faire!
Plus d'informations:
Pourquoi, par exemple, Quora est mauvais:
#include <bits/stdc++.h>
et de la différence dans la taille du fichier EXE a été de 91 KO avec, 89 KO sans.using namesapce std;
. Juste deux lignes et pratiquement tous nice identificateur est utilisé. Très frustrant de voir qu'il est enseigné.#include "stdafx.h"
Pourquoi? Car il est utilisé comme si c'était censé être un standard C++ en-tête, mais aucune norme n'en fait mention. Si votre code est non portable par construction. Vous ne trouverez pas de documentation sur cppreference. Donc, il pourrait aussi bien ne pas exister. C'est un fruit de l'imagination de quelqu'un 🙂
Il y a une Pile de site d'Échange appelé La programmation des Énigmes & Code de Golf. Le programmation puzzles sur ce site correspondent à cette définition de puzzle:
Ils sont conçus pour amuser, et non pas dans la façon dont un travail de programmeur peut être amusé par un monde réel problème rencontré dans leur travail quotidien.
Code De Golf est "un type de loisirs de la programmation informatique de la concurrence dans laquelle les participants doivent s'efforcer d'atteindre le plus possible le code source qui implémente un certain algorithme." Dans les réponses sur le PP&CG site, vous verrez des gens de spécifier le nombre d'octets dans leurs réponses. Quand ils trouvent un moyen de se raser quelques octets, ils vont frapper le numéro d'origine et d'enregistrer le nouveau.
Comme vous vous en doutez, le code de golf récompenses extrême langage de programmation abus. Une lettre des noms de variables. Pas d'espace. L'utilisation créative des fonctions de la bibliothèque. Fonctionnalités non documentées. Non pratiques de programmation. Effroyable hacks.
Si un programmeur soumis une demande d'extraction au travail contenant de golf de style de code, il serait rejeté. Leurs collègues de se moquer d'eux. Leur manager, diminuerait de leur bureau pour discuter. De même, les programmeurs s'amuser en soumettant des réponses à la PP&CG.
Qu'est-ce que avez à faire avec
stdc++.h
? Comme d'autres l'ont souligné, il est paresseux. C'est non portable, donc vous ne savez pas si cela va fonctionner sur votre compilateur ou la prochaine version de votre compilateur. Il favorise les mauvaises habitudes. Il est non-standard, de sorte que votre programme est le comportement peut être différent de ce que vous attendez. Il peut augmenter le temps de compilation et de la taille de l'exécutable.Ce sont tous valides et correctes objections. Alors pourquoi serait-on utiliser cette monstruosité?
Il s'avère que certaines personnes aiment programmation puzzles sans code de golf. Ils obtiennent ensemble et à participer à des événements comme ACM-ICPC, Google Code Jam, et Facebook Hacker Cup, ou sur des sites comme Topcoder et Codeforces. Leur rang est basé sur le programme de l'exactitude, de la vitesse d'exécution, et à quelle vitesse ils soumettre une solution. Afin de maximiser la vitesse d'exécution, de nombreux participants à l'utilisation de C++. Pour optimiser le codage de la vitesse, certains d'entre eux utilisent
stdc++.h
.Est que c'est une bonne idée? Nous allons vérifier la liste des inconvénients. La portabilité? Il n'a pas d'importance puisque ces codage des événements d'utiliser un compilateur spécifique de la version que les participants savent à l'avance. La conformité aux normes? Pas pertinent pour un bloc de code dont la durée de vie utile est inférieure à une heure. Moment de la compilation et de la taille de l'exécutable? Celles-ci ne font pas partie du concours de notation de rubrique.
Alors on se retrouve avec de mauvaises habitudes. C'est une objection valable. En utilisant ce fichier d'en-tête, les participants sont en évitant la chance d'apprendre de la norme en-tête de fichier définit les fonctionnalités qu'ils utilisent dans leur programme. Quand ils écrivent dans le monde réel de code (et non pas à l'aide de
stdc++.h
) qu'ils vont avoir à passer du temps à rechercher cette information, ce qui signifie qu'ils vont être moins productif. C'est l'inconvénient de pratiquer avecstdc++.h
.Cela soulève la question de savoir pourquoi il vaut la peine de prendre partie dans la compétitivité et la programmation à tous si il encourage les mauvaises habitudes comme 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 ont post des programmes sur PP&CG: certains programmeurs trouver agréable à utiliser leurs compétences de codage dans un jeu comme contexte.Donc la question de savoir si l'utilisation
stdc++.h
se résume à savoir si le codage des avantages de rapidité dans un concours de programmation l'emportent sur les mauvaises habitudes que l'on pourrait développer en l'utilisant.Cette question demande: "Pourquoi devrais-je pas #include
<bits/stdc++.h>
?" Je me rends compte qu'il a demandé et répondu pour faire un point, et l'on a accepté la réponse est destinée à être la seule Vraie Réponse à cette question. Mais la question n'est pas "Pourquoi devrais-je pas #include<bits/stdc++.h>
dans le code de production?" Donc, je pense qu'il est raisonnable d'envisager d'autres scénarios où la réponse peut être différente.De N4606, document de Travail, Standard pour la Programmation en Langage C++ :
17.6.1.2 en-Têtes [en-têtes]
Chaque élément de la norme C++ de la bibliothèque est déclarée ou définie (selon le cas) dans un en-tête.
Le C++ de la bibliothèque standard fournit 61 de la bibliothèque C++ en-têtes, comme indiqué dans le Tableau 14.
Tableau 14 — bibliothèque C++ en-têtes
Il n'y a pas de <bits/stdc++.h> il. Ce n'est pas surprenant, puisque <bits/...> des en-têtes de détail d'implémentation, et comportent généralement un avertissement:
<bits/stdc++.h> porte également un avertissement: