web-dev-qa-db-fra.com

Comment #include <bits / stdc ++. H> fonctionne-t-il en C ++?

J'ai lu dans un codeforces Blog que si nous #include <bits/stdc++.h> dans un programme C++, il n'est pas nécessaire d'inclure d'autres fichiers d'en-tête. comment fonctionne #include <bits/stdc++.h> et puis-je l'utiliser au lieu d'inclure des fichiers d'en-tête individuels?

104
JerryGoyal

Il s’agit d’un fichier d’en-tête qui inclut également toutes les bibliothèques standard et les fichiers d’inclusion stl. Le seul but que je vois est que ce soit pour les tests et l’éducation.

Se par exemple source GCC 4.8.0 /bits/stdc++.h .

Son utilisation inclurait beaucoup de choses inutiles et augmenterait le temps de compilation.

Edit: Comme le dit Neil, c'est une implémentation pour les en-têtes précompilés. Si vous le configurez correctement pour la précompilation, cela pourrait en fait accélérer la compilation en fonction de votre projet. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )

Je suggérerais cependant que vous preniez le temps de vous renseigner sur chacun des en-têtes sl/stl et de les inclure séparément à la place, et de ne pas utiliser de "super-en-têtes" sauf à des fins de précompilation.

100
Zelix

#include <bits/stdc++.h> est un fichier d'implémentation pour un en-tête précompilé.

Du point de vue du génie logiciel, il est judicieux de minimiser l’inclusion. Si vous l'utilisez, il contient en fait beaucoup de fichiers dont votre programme n'a peut-être pas besoin, ce qui augmente inutilement le temps de compilation et la taille du programme. [edit: comme l'a souligné @Swordfish dans les commentaires, la taille du programme de sortie reste inchangée. Néanmoins, il est judicieux de n’inclure que les bibliothèques dont vous avez réellement besoin, sauf s’il s’agit d’une concurrence.]

Mais dans les concours, l’utilisation de ce fichier est une bonne idée lorsque vous souhaitez réduire le temps perdu à faire les tâches ménagères; surtout quand votre rang est sensible au temps.

Il fonctionne dans la plupart des juges en ligne, des environnements de concours de programmation, y compris ACM-ICPC (finales mondiales, régionales et régionales) et de nombreux juges en ligne.

Les inconvénients sont que

  • augmente le temps de compilation.
  • utilise un fichier d'en-tête interne non standard de la bibliothèque GNU C++, et ne sera donc pas compilé dans MSVC, XCode et de nombreux autres compilateurs
31
abe312

Ce fichier d'en-tête ne fait pas partie de la norme C++, il n'est donc pas portable et devrait être évité.

De plus, même si la norme contenait un en-tête fourre-tout, vous voudriez l’éviter à la place d’en-têtes spécifiques, car le compilateur doit en fait lire et analyser chaque en-tête inclus (y compris les en-têtes inclus récursivement) chaque fois que l'unité de traduction est compilée.

Il s’agit d’un fichier d’en-tête qui inclut toutes les bibliothèques standard. Dans les concours de programmation, l’utilisation de ce fichier est une bonne idée lorsque vous souhaitez réduire le temps perdu à effectuer des tâches ménagères; surtout quand votre rang est sensible au temps. Dans les concours de programmation, les gens se concentrent davantage sur la recherche d'algorithme pour résoudre un problème que sur l'ingénierie logicielle. Du point de vue du génie logiciel, il est judicieux de minimiser l’inclusion. Si vous l'utilisez, il contient en fait beaucoup de fichiers dont votre programme n'a peut-être pas besoin, ce qui augmente inutilement le temps de compilation et la taille du programme.

visitez ceci pour plus de détails https://www.geeksforgeeks.org/bitsstdc-h-c/

c'est la meilleure chose pour le codage en ligne où le rang importe beaucoup

3
Vivek Ghanchi

Malheureusement, cette approche n’est pas portable C++ (jusqu’à présent).

Tous les noms standard sont dans l'espace de noms std et vous ne pouvez pas savoir quels noms sont NOT définis par include et header (en d'autres termes, il est parfaitement légal pour une implémentation de déclarer le nom std::string directement ou indirectement lors de l’utilisation de #include <vector>).

Malgré cela, toutefois, le langage vous demande de connaître et d'indiquer au compilateur quel en-tête standard inclut quelle partie de la bibliothèque standard. Ceci est une source de bogues de portabilité car si vous oubliez par exemple #include <map> mais utilisez std::map, il est possible que le programme compile de toute façon en silence et sans avertissements sur une version spécifique d'un compilateur spécifique, et des erreurs risquent de se produire. seulement plus tard lors du portage sur un autre compilateur ou une autre version.

À mon avis, il n’existe aucune excuse technique valable, car c’est nécessaire pour l’utilisateur général: le binaire du compilateur peut intégrer tous les espaces de noms standard, ce qui pourrait même accroître les performances davantage que les en-têtes précompilés (par exemple, utiliser un hachage parfait pour les en-têtes d'analyse ou de chargement/démarchage, etc.).

L'utilisation d'en-têtes standard simplifie la vie de ceux qui construisent des compilateurs ou des bibliothèques standard et c'est tout. Ce n'est pas quelque chose pour aider les utilisateurs.

Cependant, c’est la façon dont le langage est défini et vous devez savoir quel en-tête définit quels noms. Planifiez donc que des neurones supplémentaires soient brûlés dans des configurations inutiles pour vous en souvenir (ou essayez de trouver et IDE qui ajoute automatiquement les en-têtes standard que vous utilisez et supprime ceux que vous n'aimez pas ... une alternative raisonnable).

1
6502

Il s’agit d’un fichier d’en-tête qui inclut toutes les bibliothèques standard.
Dans concours de programmation, l’utilisation de ce fichier est une bonne idée lorsque vous souhaitez réduire le temps perdu à effectuer des tâches ménagères; surtout quand votre rang est sensible au temps.
Dans concours de programmation, les gens s’intéressent davantage à la recherche d’un algorithme pour résoudre un problème qu’au génie logiciel.
Mais dans génie logiciel, ce n’est pas une bonne idée d’utiliser. Si vous l'utilisez, il contient en fait beaucoup de fichiers dont votre programme peut ne pas avoir besoin, ce qui augmente inutilement le temps de compilation et la taille du programme.

1
Linkon