Hoe werkt #include <bits/stdc++.h> werken in C++?

Ik heb van een codeforcesblog gelezen dat als we #include <bits/stdc++.h>in een C++-programma, dan is het niet nodig om andere header-bestanden op te nemen. Hoe werkt #include <bits/stdc++.h>en is het oké om het te gebruiken in plaats van individuele header-bestanden op te nemen?


Antwoord 1, autoriteit 100%

Het is in feite een header-bestand dat ook elke standaardbibliotheek en STL-include-bestand bevat. Het enige doel dat ik er voor kan zien, zou zijn voor testen en onderwijs.

Zie bijv. GCC 4.8.0 /bits/stdc++.h bron.

Het zou veel onnodige dingen met zich meebrengen en de compilatietijd verlengen.

Bewerken:Zoals Neil zegt, het is een implementatie voor voorgecompileerde headers. Als u het correct instelt voor precompilatie, zou het de compilatietijd kunnen versnellen, afhankelijk van uw project. (https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers. html)

Ik zou echter willen voorstellen dat u de tijd neemt om meer te weten te komen over elk van de sl/stl-headers en ze in plaats daarvan afzonderlijk op te nemen, en geen “superheaders” te gebruiken, behalve voor precompilatiedoeleinden.


Antwoord 2, autoriteit 32%

#include <bits/stdc++.h>is een implementatiebestand voor een vooraf gecompileerde header.

Vanuit het oogpunt van software-engineering is het een goed idee om de opname te minimaliseren. Als je het gebruikt, bevat het veel bestanden, die je programma misschien niet nodig heeft, waardoor zowel de compileertijd als de programmagrootte onnodig toenemen. [edit: zoals opgemerkt door @Swordfish in de opmerkingen dat de grootte van het uitvoerprogramma onaangetast blijft. Maar toch is het een goede gewoonte om alleen de bibliotheken op te nemen die u echt nodig heeft, tenzij het een competitieve concurrentie is]

Maar bij wedstrijden is het een goed idee om dit bestand te gebruiken als je de tijd die je verspilt aan klusjes wilt verminderen; vooral als je rang tijdgevoelig is.

Het werkt in de meeste online juryleden, programmeerwedstrijdomgevingen, waaronder ACM-ICPC (subregionale, regionale en wereldfinales) en veel online juryleden.

De nadelen ervan zijn dat het:

  • verhoogt de compilatietijd.
  • gebruikt een intern niet-standaard headerbestand van de GNU C++-bibliotheek, en zal dus niet compileren in MSVC, XCode en vele andere compilers

Antwoord 3, autoriteit 21%

Dat headerbestand maakt geen deel uit van de C++-standaard, is daarom niet-draagbaar en moet worden vermeden.

Bovendien, zelfs als er een catch-all header in de standaard zou zijn, zou je deze willen vermijden in plaats van specifieke headers, aangezien de compiler elke opgenomen header (inclusief recursief opgenomen headers) elke keer moet inlezen en parseren. één keer dat de vertaaleenheid wordt gecompileerd.


Antwoord 4

Helaas is die aanpak (tot nu toe) niet portable C++.

Alle standaardnamen staan ​​in namespace stden bovendien kun je niet weten welke namen NIETzijn gedefinieerd door include en header (met andere woorden, het is volkomen legaal voor een implementatie om de naam std::stringdirect of indirect bij gebruik van #include <vector>).

Desalniettemin bent u door de taal verplicht om de compiler te weten en te vertellen welke standaardheader welk deel van de standaardbibliotheek bevat. Dit is een bron van portabiliteitsfouten, want als je bijvoorbeeld #include <map>vergeet maar std::mapgebruikt, is het mogelijk dat het programma toch stil en zonder waarschuwingen compileert op een specifieke versie van een specifieke compiler, en u kunt pas later fouten krijgen bij het overzetten naar een andere compiler of versie.

Naar mijn mening zijn er geen geldige technische excuses omdat dit nodig is voor de algemene gebruiker: de compiler-binary zou alle standaard naamruimten kunnen hebben ingebouwd en dit zou de prestaties zelfs meer kunnen verhogen dan voorgecompileerde headers (bijv. door perfecte hashing te gebruiken voor lookups , verwijderen van standaard headers voor parseren of laden/demarshallen enzovoort).

Het gebruik van standaardheaders vereenvoudigt het leven van wie compilers of standaardbibliotheken bouwt en dat is alles. Het is niet iets om gebruikers te helpen.

Dit is echter de manier waarop de taal is gedefinieerd en je moet weten welke header welke namen definieert, dus plan om wat extra neuronen te verbranden in zinloze configuraties om dat te onthouden (of probeer een IDE te vinden die automatisch de standaardheaders toevoegt u gebruikt en verwijdert degene die u niet gebruikt… een redelijk alternatief).

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes