2015-08-04 8 views
116

Zamieściłem pytanie z mojego kodu, którego jedynym #include dyrektywa był następujący:Dlaczego nie powinienem #include <bits/stdC++. H>?

#include <bits/stdc++.h> 

Mój nauczyciel powiedział mi, aby to zrobić, ale w komentarzach poinformowano mnie, że nie powinnam.

Dlaczego?

+24

Huh. Powinienem był wiedzieć, że będzie tam dołączana wersja 'using namespace std;' gdzieś tam. – user4581301

+1

dlaczego ten nagłówek istnieje? Z pewnością żaden standard nie obejmuje tego, ponieważ przyniesie mnóstwo śmieci? a jeśli nie obejmuje go żadna publiczność, to ... to dlaczego jest wysyłana w dystrybucji? –

+4

@ChrisBeck: To szczegół implementacji. Nie jest częścią "publicznego interfejsu API" ani przeznaczeniem do użytku. Ale nadal musi zostać wysłany, w przeciwnym razie nic nie będzie działać. Standard obejmuje nie może używać go indywidualnie, ale jest tam do użytku w prekompilowanych nagłówkach. Zobacz komentarz u góry, który mówi: _ "To jest plik implementacji dla prekompilowanego nagłówka." _. –

Odpowiedz

144

Wraz z <bits/stdc++.h> wydaje się być coraz bardziej powszechną rzeczą na Stack Overflow, być może coś nowego dodanego do krajowego programu nauczania w bieżącym roku akademickim.

Wyobrażam sobie zalety są niejasno podany sposób:

  • trzeba tylko napisać jedno #include linię
  • Nie trzeba zajrzeć do których standardowy nagłówek wszystko jest w

Niestety, jest to leniwy hack, nazywający się bezpośrednio nagłówkiem GCC zamiast pojedynczych standardowych nagłówków, takich jak <string>, <iostream> i <vector>. Rujnuje przenośność i sprzyja okropnym nawykom.

Wady to:

  • To prawdopodobnie będzie działać tylko na tym kompilator
  • Nie masz pojęcia, co zrobię, kiedy go używać, ponieważ jego zawartość nie są ustawione za pomocą standardowego
  • Nawet tylko uaktualniania kompilatora do swojej kolejnej wersji może przełamać swój program
  • Każdy standardowy nagłówek musi być analizowany i kompilowane wraz z kodem źródłowym, który jest powolny i powoduje wielkogabarytowych wykonywalnego przy pewnych ustawieniach kompilacji

Nie rób tego!


Więcej informacji:

Przykład dlaczego Quora jest zły:

+33

"Być może coś nowego dodano do krajowego programu nauczania w bieżącym roku akademickim" Niewidomy prowadzący niewidomego :( –

+10

@KubaOber: Dokładnie –

+0

Jednak przy pewnych ustawieniach kompilacji użycie prekompilowanych nagłówków skróci czas kompilacji. gotowe ustawienia, po prostu skompilowałem trywialny program zi bez '#include ', a różnica w rozmiarze pliku EXE wyniosła 91 KB z, 89 KB bez. –

14

Dlaczego? Ponieważ jest używany tak, jakby miał być standardowym nagłówkiem C++, ale żaden standard go nie wspomina. Więc twój kod jest nieprzenośny przez konstrukcję. Nie znajdziesz dla niego żadnej dokumentacji na http://cppreference.com Więc równie dobrze może nie istnieć. To wymysł czyjejś wyobraźni :)

-5

Jak wyjaśniono w górnej odpowiedzi na pytanie Quora wspomniane przez @Lightness Races na Orbicie, nie ma nic złego w dodawaniu bitów/stdC++ .h w kontekście konkursu programistycznego.Wady związane z przenośnością, czasem kompilacji i standaryzacją nie są tam istotne. To samo byłoby prawdą w klasie programowej uczelni, jeśli zastosowany przykładowy kod to.

Jeśli piszesz kod produkcyjny, nie używaj go. Przełączanie się w tę iz powrotem nie powinno być wielkim problemem, w zależności od celu kodu, który obecnie piszesz.

+24

Meh, jeśli konkurs programistyczny ocenia złamany, niestandardowy kod, to tak naprawdę nie rozumiem tego. "Kto może najszybciej złamać najbardziej złamany kod" tak! Dobra robota, chyba ... –

+4

Jednoczęściowa wygoda nie sprawia, że ​​cały program jest zepsuty, tak samo jak na przykład przy użyciu krótkich nazw zmiennych. Myślę, że możesz oceniać całe konkurencyjne programowanie w oparciu o kilka osób, które pojawiają się w SO z nietypowymi pytaniami na ten temat. – RedGreenCode

+10

Używanie krótkich nazw zmiennych i używanie '#include ' to _ zupełnie inne rzeczy! –

Powiązane problemy