De ce să nu #includ ?

Am postat o intrebare cu codul meu, a cărui singură `#include directiva fost următoarele:

#include <bits/stdc++.h>

Profesorul meu mi-a spus să facă acest lucru, dar, în secțiunea de comentarii am fost informat că nu ar trebui't.

De ce?

Comentarii la întrebare (7)
Soluția

Inclusiv <biți/stdc++.h> pare a fi din ce în ce mai comun lucru pentru a vedea pe Stack Overflow, poate ceva nou adăugat la un curriculum național în actualul an universitar.

Îmi imaginez că avantajele sunt vag dat astfel:

  • Ai nevoie doar de a scrie o `#include linia
  • Nu aveți nevoie să se uite în sus care antet standard, totul este în

Din păcate, acest lucru este un leneș hack, numind-o CCG interne antet direct în loc de standard individuale antete ca <string>, <iostream> " și " <vector>. Ruinele portabilitate și favorizează obiceiuri oribile.

Dezavantajele includ:

  • Se va lucra, probabil, doar pe compiler
  • N-ai idee ce-l'll face atunci când este utilizat, deoarece conținutul său nu sunt stabilite printr-un standard
  • Chiar și doar modernizarea compilator pentru propria următoarea versiune de program
  • Fiecare antet standard trebuie să fie analizate și compilate împreună cu codul sursă, care este lent și rezultatele într-o voluminoase executabil în anumite compilație setări

Don't face!


Mai multe informații:

Exemplu de ce Quora este rău:

Comentarii (10)

De ce? Deoarece este folosit ca în cazul în care a fost trebuia să fie un standard C++ header, dar nu standard, menționează acesta. Deci codul este non-portabil de construcție. Ai câștigat't găsi documentația pe cppreference. Deci s-ar putea la fel de bine să nu existe. L's o născocire de cineva's imaginație :)

Comentarii (0)

Nu's-o Stivă de Schimb site-ul numit de Programare Puzzle-uri & Codul de Golf. De programare puzzle-uri de pe site-ul respectiv se încadrează în această definiție a puzzle:

o jucărie, o problema, sau alte artificiu conceput pentru a amuza prin prezentarea dificultăților de a fi rezolvate prin ingeniozitate sau efort pacientului.

Acestea sunt concepute pentru a distra, și nu în felul în care un lucru programator-ar fi amuzat de o lume reală problemă întâlnite în munca de zi cu zi.

Codul de Golf este "un tip de recreere programare pe calculator concurs în care participanții să depună eforturi pentru a atinge cel mai scurt posibil codul sursă care implementează un anumit algoritm." În răspunsurile pe PP&CG-ul, ai'll vedea oameni care specifica numarul de bytes în răspunsurile lor. Când vor găsi o cale să radă câteva bytes, au'll lovi numărul inițial și înregistra unul nou.

Ca s-ar putea aștepta, cod golf recompense extreme limbaj de programare abuz. O scrisoare de nume de variabile. Nici spațiu. Utilizarea creativă de funcții de bibliotecă. Caracteristici fără acte. Non-standard de programare destinații de plasare. Îngrozitoare hacks.

Dacă un programator a depus o cerere de tragere la locul de muncă conțin golf-cod de stil, ar fi respins. Lor co-lucrătorilor ar râde de ei. Managerul lor ar scădea de birou pentru o discuție. Chiar și așa, programatori se amuza prin transmiterea de răspunsuri la PP&CG.

Ce are asta de-a face cu stdc++.h? Ca altii au subliniat, folosindu-se leneș. L's non-portabil, astfel încât să don't știu dacă se va lucra pe compiler sau următoarea versiune de compilator. Acesta promovează obiceiurile proaste. L's non-standard, astfel încât programul's de comportament pot fi diferite de ceea ce vă așteptați. Acesta poate crește timpul de compilare și dimensiunea executabil.

Toate acestea sunt valabile și corecte obiecții. Deci, de ce ar folosi cineva monstruozitatea asta?

Se pare că unii oameni, cum ar fi programare puzzle-uri fără codul de golf. Se adună și concurează la evenimente ca ACM-ICPC, Google Code Jam, și Facebook Hacker Cup, sau pe site-uri ca Topcoder și Codeforces. Rangul lor este bazat pe program corectitudinea, viteza de executie, și cât de repede se prezinte o soluție. Pentru a maximiza viteza de executie, mulți participanți folosi C++. Pentru a maximiza codificare viteza, unele dintre ele folosesc stdc++.h`.

Este o idee bună? Las's a verifica lista de dezavantaje. Portabilitatea? Nu't contează, deoarece aceste codificare evenimente folosi un compilator specific versiune care concurenții știe în avans. Respectarea standardelor? Nu este relevant pentru un bloc de cod a căror durata de viață utilă este mai puțin de o oră. Compilare și dimensiunea executabil? Acestea sunt't parte a concursului's notare rubrica.

Așa că ne-am're rămas cu obiceiurile rele. Aceasta este o obiecție valabilă. Utilizând acest fișier antet, concurenții sunt evitarea șansa de a învăța ceea ce standard de fișier header definește funcționalitatea ei're folosind în programul lor. Când au're scris din lumea reală cod (și nu folosesc stdc++.h) ei'll trebuie să-și petreacă timp căutând aceste informații, ceea ce înseamnă că'll fi mai puțin productiv. Ca's dezavantajul de a practica cu stdc++.h`.

Acest lucru ridică întrebarea de ce se's valoare de a lua parte la programare competitive la toate, dacă acesta încurajează obiceiurile proaste cum ar fi utilizarea stdc++.h și încalcă alte standarde de codificare. Un răspuns este că oamenii fac asta din același motiv pentru care au post programele de pe PP&CG: unii programatori găsi plăcută să își folosească abilitățile de codificare într-un joc, cum ar fi contextul.

Deci, întrebarea dacă pentru a folosi stdc++.h` dacă codificare viteza de beneficii într-un concurs de programare depășesc obiceiurile rele care s-ar putea dezvolta prin utilizarea acestuia.

Această întrebare vă cere: "de Ce să nu #includ<biți/stdc++.h>?" mi-am dat seama că a fost întrebat și a răspuns pentru a face un punct, iar răspunsul acceptat este destinat pentru a fi Un Adevărat Răspuns la această întrebare. Dar întrebarea e&#39;t "de Ce să nu #includ<biți/stdc++.h> din codul de producție?" prin Urmare, cred că's rezonabil să se ia în considerare și alte scenarii în cazul în care răspunsul poate fi diferit.

Comentarii (4)

Din N4606, Proiect de Lucru, Standard pentru Limbajul de Programare C++ :

17.6.1.2 Antete [antete]

  1. Fiecare element din biblioteca standard C++ este declarat sau definite (după caz) într-un antet.

  2. Biblioteca standard C++ oferă 61 C++ bibliotecă cap, așa cum se arată în Tabelul 14.

Tabelul 14 — C++ bibliotecă antete
















Nu's nu <biți/stdc++.h> acolo. Acest lucru nu este surprinzător, deoarece <biți/...> cap sunt de implementare detaliu, și, de obicei, transporta un avertisment:

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

<biți/stdc++.h> poartă, de asemenea, un avertisment:

*  This is an implementation file for a precompiled header.
Comentarii (1)