Почему я не должен #include <bits/stdС++. H>?

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

#include <bits/stdc++.h>

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

Почему?

Ответ 1

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

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

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

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

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

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

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


Дополнительная информация:

Пример того, почему Quora плохой:

Ответ 2

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

Ответ 3

Существует сайт обмена стека под названием Программирование головоломок и кода Гольф. Головоломки для программирования на этом сайте соответствуют определению головоломки: "игрушка, проблема или другое ухищрение, предназначенное для развлечения, создавая трудности, которые необходимо решить с помощью изобретательности или терпеливых усилий". Они предназначены для развлечения, а не для того, чтобы работающий программист мог быть удивлен реальной проблемой, возникающей в их повседневной работе.

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> в производственном коде? Поэтому я считаю разумным рассмотреть другие сценарии, где ответ может быть другим.

Ответ 4

Короткий ответ

Следующий фрагмент не будет компилироваться:

#include <bits/stdc++.h>
using namespace std;

int y0;

int main() {
    cout << "Hello" << endl;
    return 0;
}

Достаточно веской причины?

Ответ 5

Как объяснялось в верхнем ответе на вопрос Quora, упомянутый в @Lightness Races на орбите, нет ничего плохого в том, чтобы включить бит/stdС++. h в контексте соревнований по программированию. Недостатки, связанные с переносимостью, временем компиляции и стандартизацией, здесь не актуальны. То же самое было бы верно в классе программирования в колледже, если бы использовался использованный код примера.

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