Почему я не должен включать <bits stdc++.h=""></bits>

c++ portability turbo-c++ c++-faq implementation-defined-behavior


Я отправил вопрос с моим кодом, единственная директива которого #include была следующей:

#include <bits/stdc++.h>

Моя учительница сказала мне сделать это,но в разделе комментариев мне сообщили,что я не должен этого делать.

Why?




Answer 1 Lightness Races in Orbit


Включение <bits/stdc++.h> , по-видимому, становится все более распространенным явлением в переполнении стека, возможно, что-то новое, добавленное в национальную учебную программу в текущем учебном году.

Я полагаю,что преимущества даются смутно:

  • Вам нужно написать только одну строку #include
  • Вам не нужно искать,в каком стандартном заголовке все находится.

К сожалению, это ленивый хак, который называет внутренний заголовок GCC напрямую, а не отдельными стандартными заголовками, такими как <string> , <iostream> и <vector> . Это разрушает мобильность и воспитывает ужасные привычки.

К недостаткам относятся:

  • Скорее всего,он будет работать только на этом компиляторе
  • Вы понятия не имеете,что он будет делать,когда вы его используете,потому что его содержание не установлено стандартом.
  • Даже простое обновление компилятора до его собственной следующей версии может сломать вашу программу.
  • Каждый стандартный заголовок должен быть разобран и скомпилирован вместе с вашим исходным кодом,что является медленным и приводит к громоздкому исполняемому файлу при определенных настройках компиляции

Не делай этого!


Больше информации:

Пример того,почему Квора плохая:




Answer 2 Reinstate Monica


Почему? Потому что он используется так, как если бы он был стандартным заголовком C ++, но ни один стандарт не упоминает об этом. Таким образом, ваш код непереносим по построению. Вы не найдете никакой документации для этого на cppreference . Так что это может с таким же успехом не существовать. Это плод чьего-то воображения :)

К моему ужасу и неверию, я обнаружил, что есть хорошо известный учебный сайт, где каждый пример C ++, похоже, содержит этот заголовок . Мир безумен. Это доказательство.


Для тех, кто пишет такие "учебники"

Пожалуйста, прекратите использовать этот заголовок. Забудь об этом. Не распространяйте это безумие. Если вы не хотите понять, почему это неправильно , поверьте мне на слово. Я не в порядке, когда ко мне относятся как к авторитетной фигуре, и я, вероятно, наполовину занят этим, но я сделаю исключение только в этом одном случае. Я утверждаю, что знаю, о чем я говорю здесь. Поверь мне на слово. Я умоляю тебя.

P.S.Я хорошо представляю себе отвратительный "стандарт обучения",в котором эта злая идея могла иметь место,и обстоятельства,которые привели к этому.Просто потому,что казалось,что в этом есть практическая необходимость,не делает его приемлемым-даже в ретроспективе.

P.P.S.Нет,в этом не было никакой практической необходимости.Не так уж много стандартных заголовков C++,и они хорошо задокументированы.Если вы преподаете,вы оказываете своим студентам услугу,добавляя такое "волшебство".Производить программистов с волшебным мышлением-это последнее,чего мы хотим.Если вам нужно предложить студентам подмножество C++,чтобы облегчить им жизнь,просто сделайте раздаточный материал с коротким списком заголовков,применимых к преподаваемому курсу,и с краткой документацией к конструкциям библиотеки,которые,как вы ожидаете,будут использоваться студентами.




Answer 3 RedGreenCode


Существует сайт обмена стеками под названием « Программирование головоломок и код-гольф» . В головоломки программирования на этом сайте соответствуют этому определению головоломки :

игрушка,проблема или другое приспособление,предназначенное для развлечения,представляя трудности,которые должны быть решены изобретательностью или усилиями пациента.

Они предназначены для развлечения,а не для того,чтобы забавлять работающего программиста реальной проблемой,с которой он сталкивается в своей повседневной работе.

Code Golf - это «тип соревнования по развлекательному компьютерному программированию, в котором участники стремятся получить максимально короткий исходный код, реализующий определенный алгоритм». В ответах на сайте PP & CG вы увидите, как люди указывают количество байтов в своих ответах. Когда они найдут способ сбрить несколько байтов, они вычеркнут исходное число и запишут новое.

Как и следовало ожидать,гольф по коду вознаграждает экстремальное злоупотребление языком программирования.Однобуквенные имена переменных.Без пробелов.Творческое использование библиотечных функций.Недокументированные функции.Нестандартная практика программирования.Ужасные взломы.

Если на работе программист отправит запрос на извлечение, содержащий код в стиле гольфа, он будет отклонен. Их сотрудники смеялись бы над ними. Их менеджер заходил к их столу, чтобы поболтать. Тем не менее, программисты развлекаются, отправляя ответы в PP & CG.

Какое это имеет отношение к stdc++.h ? Как уже отмечали другие, использовать его лениво. Он не переносимый, поэтому вы не знаете, будет ли он работать на вашем компиляторе или на следующей версии вашего компилятора. Это воспитывает вредные привычки. Это нестандартно, поэтому поведение вашей программы может отличаться от ожидаемого. Это может увеличить время компиляции и размер исполняемого файла.

Все эти возражения являются обоснованными и правильными.Так зачем кому-то использовать это чудовище?

Оказывается, некоторые люди любят программировать головоломки без кода игры в гольф . Они собираются вместе и соревнуются на таких мероприятиях, как ACM-ICPC, Google Code Jam и Facebook Hacker Cup, или на таких сайтах, как Topcoder и Codeforces. Их рейтинг основан на правильности программы, скорости выполнения и скорости, с которой они отправляют решение. Чтобы максимизировать скорость выполнения, многие участники используют C ++. Для того, чтобы увеличить скорость кодирования, некоторые из них используют stdc++.h .

Это хорошая идея? Давайте проверим список недостатков.Портативность? Это не имеет значения,так как в этих событиях кодирования используется конкретная версия компилятора,заранее известная участникам конкурса.Соответствие стандартам? Не имеет значения для блока кода,срок полезного использования которого меньше часа.Время компиляции и размер исполняемого файла? Это не входит в рубрику оценки конкурса.

Итак, у нас остались вредные привычки. Это действительное возражение. Используя этот заголовочный файл, участники избегают возможности узнать, какой стандартный заголовочный файл определяет функции, которые они используют в своей программе. Когда они пишут реальный код (и не используют stdc++.h ), им придется тратить время на поиск этой информации, а значит, они будут менее продуктивными. Это оборотная сторона практики с stdc++.h .

Возникает вопрос, почему вообще стоит участвовать в конкурентном программировании, если оно поощряет вредные привычки, такие как использование stdc++.h и нарушение других стандартов кодирования. Один из ответов заключается в том, что люди делают это по той же причине, по которой они публикуют программы на PP & CG: некоторым программистам нравится использовать свои навыки программирования в игровом контексте.

Таким образом, вопрос о том, использовать ли stdc++.h сводится к тому, перевешивает ли скорость кодирования в конкурсе программирования перевес вредных привычек, которые можно выработать, используя его.

Этот вопрос спрашивает: «Почему я не должен #include <bits/stdc++.h> ?» Я понимаю, что это было задано и получено ответ, чтобы сделать точку, и принятый ответ предназначен для Единого Истинного Ответа на этот вопрос. Но вопрос не в том, почему я не #include <bits/stdc++.h> в производственном коде? Поэтому я считаю разумным рассмотреть другие сценарии, где ответ может быть другим.




Answer 4 Bulletmagnet


Из N4606,рабочий черновик,стандарт для языка программирования C++:

17.6.1.2 Заголовки [заголовки]

  1. Каждый элемент стандартной библиотеки C++объявляется или определяется (соответственно)в заголовке.

  2. Стандартная библиотека C++содержит 61 заголовок библиотеки C++,как показано в Таблице 14.

Таблица 14 - Заголовки библиотеки C ++

<algorithm> <future> <numeric> <strstream>
<any> <initializer_list> <optional> <system_error>
<array> <iomanip> <ostream> <thread>
<atomic> <ios> <queue> <tuple>
<bitset> <iosfwd> <random> <type_traits>
<chrono> <iostream> <ratio> <typeindex>
<codecvt> <istream> <regex> <typeinfo>
<complex> <iterator> <scoped_allocator> <unordered_map>
<condition_variable> <limits> <set> <unordered_set>
<deque> <list> <shared_mutex> <utility>
<exception> <locale> <sstream> <valarray>
<execution> <map> <stack> <variant>
<filesystem> <memory> <stdexcept> <vector>
<forward_list> <memory_resorce> <streambuf>
<fstream> <mutex> <string>
<functional> <new> <string_view>

Там нет <bits / stdc ++. H> там. Это неудивительно, поскольку заголовки <bits / ...> являются деталями реализации и обычно содержат предупреждение:

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

<bits / stdc ++. h> также несет предупреждение:

*  This is an implementation file for a precompiled header.