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?

Author: Prakash Gautam, 2014-08-14

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.

 82
Author: Zelix,
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
 26
Author: abe312,
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.

 21
Author: Robert Allan Hennigan Leahy,
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ę).

 1
Author: 6502,
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.

 1
Author: Linkon,
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