Wysłałem pytanie z moim kodem, którego jedyną #include
dyrektywą było:
#include <bits/stdc++.h>
Mój nauczyciel kazał mi to zrobić, ale w sekcji komentarzy poinformowano mnie, że nie powinienem.
Czemu?
c++
portability
turbo-c++
c++-faq
implementation-defined-behavior
Lekkość Wyścigi na orbicie
źródło
źródło
using namespace std;
, że gdzieś tam będzie dostępna wersja .bits/stdc++.h.gch
zamiast tego prekompilowaną wersję. Istnieje, ponieważ musi istnieć, aby można było wygenerować jego wstępnie skompilowaną wersję.Odpowiedzi:
Uwzględnianie
<bits/stdc++.h>
wydaje się coraz bardziej powszechne w stosie przepełnienia stosu, być może coś nowego w krajowym programie nauczania w bieżącym roku akademickim.Wyobrażam sobie, że korzyści są niejasno podane w ten sposób:
#include
linięNiestety, jest to leniwy hack, nazywania wewnętrzny nagłówek GCC bezpośrednio zamiast poszczególnych standardowych nagłówków jak
<string>
,<iostream>
i<vector>
. Rujnuje przenośność i sprzyja okropnym nawykom.Wady obejmują:
Nie rób tego!
Więcej informacji:
Przykład, dlaczego Quora jest zły:
źródło
using namesapce std;
. Tylko dwie linie i praktycznie każdy ładny identyfikator jest używany. Niesamowicie frustrujące, gdy się go uczy.Czemu? Ponieważ jest używany tak, jakby miał to być standardowy nagłówek C ++, ale żaden standard go nie wspomina. Twój kod jest więc nieprzenośny z założenia. Nie znajdziesz dla niego żadnej dokumentacji na cppreference . Więc równie dobrze może nie istnieć. To wymysł czyjejś wyobraźni :)
Odkryłem - ku mojemu przerażeniu i niedowierzaniu - że istnieje dobrze znana strona z samouczkami, w której każdy przykład C ++ wydaje się zawierać ten nagłówek . Świat jest szalony. To jest dowód.
Do każdego, kto pisze takie „samouczki”
Przestań używać tego nagłówka. Zapomnij o tym. Nie propaguj tego szaleństwa. Jeśli nie chcesz zrozumieć, dlaczego to jest źle , uwierz mi na słowo. Wcale nie jestem OK traktowany jako autorytet w jakiejkolwiek sprawie i prawdopodobnie jestem tego pełen w połowie czasu, ale zrobię wyjątek tylko w tym jednym przypadku. Twierdzę, że wiem o czym tu mówię. Uwierz mi na słowo. Błagam cię
PS Mogę sobie wyobrazić obrzydliwy „standard nauczania”, w którym mógł mieć miejsce ten nikczemny pomysł, i okoliczności, które do niego doprowadziły. To, że wydawało się, że istnieje praktyczna potrzeba, nie czyni go akceptowalnym - nawet z perspektywy czasu.
PPS Nie, nie było praktycznej potrzeby. Nie ma zbyt wielu standardowych nagłówków C ++ i są one dobrze udokumentowane. Jeśli uczysz, wyrządzasz swoim uczniom krzywdę, dodając taką „magię”. Produkcja programistów o magicznym sposobie myślenia to ostatnia rzecz, jakiej chcemy. Jeśli chcesz zaoferować uczniom podzbiór języka C ++, aby ułatwić im życie, po prostu przygotuj ulotkę z krótką listą nagłówków dotyczącą kursu, którego uczysz, oraz ze zwięzłą dokumentacją dotyczącą konstrukcji bibliotek, których oczekujesz od studentów.
źródło
Istnieje witryna Stack Exchange o nazwie Programming Puzzles & Code Golf . Te puzzle programowania na tej stronie dopasować tę definicję układanki :
Zostały zaprojektowane z myślą o rozrywce, a nie w taki sposób, aby działający programista był rozbawiony rzeczywistym problemem napotykanym w ich codziennej pracy.
Code Golf to „rodzaj rekreacyjnych zawodów programistycznych, w których uczestnicy starają się uzyskać możliwie najkrótszy kod źródłowy, który implementuje określony algorytm”. W odpowiedziach na stronie PP&CG zobaczysz, jak ludzie określają liczbę bajtów w swoich odpowiedziach. Kiedy znajdą sposób na ogolenie kilku bajtów, wykreślą oryginalny numer i zapiszą nowy.
Jak można się spodziewać, golf-golf nagradza ekstremalne nadużycia w języku programowania. Jednoliterowe nazwy zmiennych. Brak białych znaków. Kreatywne wykorzystanie funkcji bibliotecznych. Funkcje nieudokumentowane. Niestandardowe praktyki programowania. Przerażające hacki.
Gdyby programista wysłał w pracy żądanie ściągnięcia zawierające kod w stylu golfa, zostanie ono odrzucone. Ich współpracownicy będą się z nich śmiać. Ich kierownik wpadał przy biurku na czat. Mimo to programiści bawią się, przesyłając odpowiedzi do PP&CG.
Co to ma wspólnego
stdc++.h
? Jak zauważyli inni, używanie go jest leniwe. Jest nieprzenośny, więc nie wiesz, czy będzie działać na twoim kompilatorze, czy na następnej wersji kompilatora. Sprzyja złym nawykom. Jest niestandardowy, więc zachowanie Twojego programu może różnić się od tego, czego oczekujesz. Może to wydłużyć czas kompilacji i rozmiar pliku wykonywalnego.Są to wszystkie uzasadnione i poprawne zastrzeżenia. Dlaczego więc ktoś miałby używać tej potworności?
Okazuje się, że niektórzy ludzie lubią programować puzzle bez kodu golfa . Łączą się i rywalizują na imprezach takich jak ACM-ICPC, Google Code Jam i Facebook Hacker Cup, lub na stronach takich jak Topcoder i Codeforces. Ich ranga zależy od poprawności programu, szybkości wykonania i tego, jak szybko przesyłają rozwiązanie. Aby zmaksymalizować szybkość wykonywania, wielu uczestników używa C ++. Aby zmaksymalizować prędkość kodowania, niektóre z nich używają
stdc++.h
.Czy to dobry pomysł? Sprawdźmy listę wad. Ruchliwość? Nie ma to znaczenia, ponieważ te zdarzenia kodowania używają określonej wersji kompilatora, którą znają wcześniej zawodnicy. Zgodność z normami? Nie dotyczy bloku kodu, którego okres użytkowania wynosi mniej niż godzinę. Skompiluj czas i rozmiar pliku wykonywalnego? Nie są one częścią rubryki punktacji konkursu.
Więc mamy złe nawyki. To jest ważny sprzeciw. Korzystając z tego pliku nagłówkowego, uczestnicy unikają szansy dowiedzenia się, który standardowy plik nagłówkowy określa funkcjonalność, z której korzystają w swoim programie. Kiedy piszą rzeczywisty kod (i nie używają
stdc++.h
), będą musieli spędzać czas na wyszukiwaniu tych informacji, co oznacza, że będą mniej wydajni. To jest minus ćwiczenia zstdc++.h
.Rodzi to pytanie, dlaczego w ogóle warto brać udział w programowaniu konkurencyjnym, jeśli zachęca do złych nawyków, takich jak używanie
stdc++.h
i łamanie innych standardów kodowania. Jedną odpowiedzią jest to, że ludzie robią to z tego samego powodu, dla którego publikują programy na PP&CG: niektórzy programiści uważają za przyjemne korzystanie ze swoich umiejętności kodowania w kontekście gry.Tak więc pytanie, czy używać,
stdc++.h
sprowadza się do tego, czy korzyści płynące z szybkości kodowania w konkursie programistycznym przeważają nad złymi nawykami, które można rozwinąć, używając go.Pytanie to brzmi: „Dlaczego nie powinienem #include
<bits/stdc++.h>
?” Zdaję sobie sprawę, że został on poproszony o udzielenie odpowiedzi, a zaakceptowana odpowiedź ma stanowić Jedną Prawdziwą Odpowiedź na to pytanie. Ale pytanie nie brzmi „Dlaczego nie powinienem # zawierać<bits/stdc++.h>
kodu produkcyjnego?” Dlatego uważam, że uzasadnione jest rozważenie innych scenariuszy, w których odpowiedź może być inna.źródło
Od N4606, Working Draft, Standard for Programming Language C ++:
17.6.1.2 Nagłówki [nagłówki]
Każdy element standardowej biblioteki C ++ jest zadeklarowany lub zdefiniowany (odpowiednio) w nagłówku.
Standardowa biblioteka C ++ zawiera 61 nagłówków bibliotek C ++, jak pokazano w tabeli 14.
Tabela 14 - Nagłówki bibliotek C ++
Nie ma tam <bits / stdc ++. H>. Nie jest to zaskakujące, ponieważ nagłówki <bits / ...> są szczegółami implementacji i zwykle zawierają ostrzeżenie:
<bits / stdc ++. h> zawiera również ostrzeżenie:
źródło