Jak działa #include W C++?
Przeczytałem z bloga codeforces , że jeśli #include <bits/stdc++.h>
w programie C++
to nie ma potrzeby dołączania żadnych innych plików nagłówkowych. jak działa #include <bits/stdc++.h>
i czy można go używać zamiast dołączania pojedynczych plików nagłówkowych?
5 answers
Jest to w zasadzie plik nagłówkowy, który zawiera również każdą bibliotekę standardową i plik dołączający stl. Jedynym celem, jaki widzę, byłoby Testowanie i edukacja.
Se np. GCC 4.8.0 / bits / stdc++.źródło h .
Korzystanie z niego obejmowałoby wiele niepotrzebnych rzeczy i wydłużyłoby czas kompilacji.
Edit: jak mówi Neil, jest to implementacja dla wstępnie skompilowanych nagłówków. Jeśli poprawnie skonfigurujesz go do prekompilacji, może to w rzeczywistości przyspieszyć czas kompilacji w zależności od projektu. ( https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html )
Sugerowałbym jednak, abyś poświęcił trochę czasu na zapoznanie się z każdym z nagłówków SL / stl i dołączał je osobno, a nie używał "superheaderów" z wyjątkiem celów prekompilacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 00:08:37
#include <bits/stdc++.h>
jest plikiem implementacji precompilowanego nagłówka.
Z perspektywy inżynierii oprogramowania, dobrym pomysłem jest zminimalizowanie include. Jeśli używasz go w rzeczywistości zawiera wiele plików, których Twój program może nie potrzebować, co niepotrzebnie zwiększa zarówno czas kompilacji, jak i rozmiar programu. [edit: jak zauważył @Swordfish w komentarzach, rozmiar programu wyjściowego pozostaje nienaruszony. Ale mimo to dobrą praktyką jest dołączanie tylko tych bibliotek, których faktycznie potrzebujesz, chyba że niektóre konkurencje konkursowe]
Ale w konkursach używanie tego pliku jest dobrym pomysłem, gdy chcesz zredukować czas zmarnowany na wykonywanie obowiązków; szczególnie, gdy Twoja ranga jest wrażliwa na czas.
Działa w większości sędziów online, środowiskach konkursów programistycznych, w tym ACM-ICPC (Subregionals, Regionals i World Finals) i wielu sędziów online.
Wadą tego jest to, że to
- zwiększa czas kompilacji.
- używa wewnętrznego niestandardowego plik nagłówkowy biblioteki GNU C++, a więc nie będzie kompilowany w MSVC, XCode i wielu innych kompilatorach
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-28 18:14:38
Ten plik nagłówkowy nie jest częścią standardu C++, dlatego nie jest przenośny i należy go unikać.
Co więcej, nawet jeśli w standardzie były nagłówki typu catch-all, powinieneś unikać ich zamiast konkretnych nagłówków, ponieważ kompilator musi faktycznie czytać i analizować każdy dołączony nagłówek (w tym rekurencyjnie dołączone nagłówki) za każdym razem, gdy jednostka tłumaczenia jest kompilowana.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-14 14:48:44
Niestety to podejście nie jest przenośne C++ (jak na razie).
Wszystkie standardowe nazwy są w przestrzeni nazw std
, a ponadto nie możesz wiedzieć, które nazwy są Nie zdefiniowane przez nagłówek including and (innymi słowy jest całkowicie legalne dla implementacji deklarowanie nazwy std::string
bezpośrednio lub pośrednio podczas używania #include <vector>
).
Mimo to język wymaga od kompilatora, aby wiedział i powiedział, który standardowy nagłówek zawiera która część biblioteki standardowej. Jest to źródło błędów przenośności, ponieważ jeśli zapomnisz na przykład #include <map>
, ale użyjesz std::map
, możliwe jest, że program kompiluje i tak cicho i bez ostrzeżeń na określonej wersji konkretnego kompilatora, a błędy mogą pojawić się dopiero później podczas przenoszenia do innego kompilatora lub wersji.
Moim zdaniem nie ma ważnych wymówek technicznych, ponieważ jest to konieczne dla ogólnego użytkownika: kompilator binarny może mieć wszystkie standardowe przestrzenie nazw wbudowane i to może faktycznie zwiększyć wydajność nawet większa niż wstępnie skompilowane nagłówki (np. użycie doskonałego hashowania do wyszukiwania, usunięcie standardowego parsowania nagłówków lub ładowania/demarshalingu itd.).
Użycie standardowych nagłówków upraszcza życie kompilatorów lub bibliotek standardowych i to wszystko. To nie jest coś, aby pomóc użytkownikom.
Jednak tak jest zdefiniowany język i musisz wiedzieć, który nagłówek definiuje które nazwy, więc zaplanuj, aby niektóre dodatkowe neurony zostały spalone w bezsensowny konfiguracje, aby o tym pamiętać (lub spróbuj znaleźć i IDE, które automatycznie dodaje standardowe nagłówki, których używasz, i usuwa te, których nie używasz... rozsądną alternatywę).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-30 07:44:31
Jest to w zasadzie plik nagłówkowy, który zawiera każdą standardową bibliotekę.
W konkursach programistycznych , używanie tego pliku jest dobrym pomysłem, gdy chcesz zredukować czas marnowany na wykonywanie obowiązków; szczególnie, gdy Twoja ranga jest wrażliwa na czas.
W konkursach programistycznych ludzie skupiają się bardziej na znalezieniu algorytmu do rozwiązania problemu niż na inżynierii oprogramowania.
Ale z perspektywy inżynierii oprogramowania nie jest to dobry pomysł. Jeśli używasz go faktycznie obejmuje wiele plików, których Twój program może nie potrzebować, niepotrzebnie zwiększa zarówno czas kompilacji, jak i rozmiar programu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-10 08:38:00