Как работает #include в C++?

Я прочитал от codeforces блог, что если мы #include <bits/stdc++.h> на C++ program тогда нет необходимости включать какие-либо другие файлы заголовков. как это #include <bits/stdc++.h> работает, и можно ли использовать его вместо включения отдельных файлов заголовков?

5 ответов


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

Se например GCC 4.8.0 / bits / stdc++.ч Источник.

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

Edit: как говорит Нил, это реализация для предварительно скомпилированных заголовков. Если вы правильно настроили его для предварительной компиляции, это может на самом деле ускорить время компиляции, в зависимости от вашего проекта. (https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html)

однако я бы предложил вам потратить время, чтобы узнать о каждом из заголовков sl/stl и включить их отдельно, а не использовать "перегружатели", кроме как для целей предварительной компиляции.


#include <bits/stdc++.h> - это файл реализации для предварительно скомпилированного заголовка.

С точки зрения разработки программного обеспечения, рекомендуется свести к минимуму включение. Если вы используете его на самом деле включает в себя много файлов, которые программа может не понадобиться, таким образом, увеличить время компиляции и размер программы без надобности. [edit: как указано @Swordfish в комментариях, размер выходной программы остается неизменным. Но все же, это хорошая практика, чтобы включить только библиотеки, которые вам действительно нужны, если это не какая-то конкурентная конкуренция]

но в конкурсах использование этого файла-хорошая идея, когда вы хотите сократить время, потраченное на выполнение домашних обязанностей; особенно когда ваш ранг чувствителен ко времени.

он работает в большинстве онлайн-судей, среды программирования конкурса, включая ACM-ICPC (субрегиональные, региональные и мировые финалы) и многих онлайн-судей.

недостатки его в том, что он

  • увеличивает компиляции время.
  • использует внутренний нестандартный файл заголовка библиотеки GNU C++ и поэтому не будет компилироваться в MSVC, XCode и многих других компиляторах

этот файл заголовка не является частью стандарта C++, поэтому не переносится и его следует избегать.

более того, даже если бы в стандарте был какой-то заголовок catch-all, вы хотели бы избежать его вместо определенных заголовков, так как компилятор должен фактически читать и анализировать каждый включенный заголовок (включая рекурсивно включенные заголовки) каждый раз, когда блок перевода компилируется.


к сожалению, этот подход не является портативным C++ (до сих пор).

все стандартные имена в пространстве имен std и более того, вы не можете знать, какие имена не определяется включением и заголовком (другими словами, это совершенно законно для реализации объявить имя std::string прямо или косвенно при использовании #include <vector>).

несмотря на это, однако язык требует, чтобы вы знали и сообщали компилятору, какой стандартный заголовок включает в себя часть стандартной библиотеки. Это источник ошибок переносимости, потому что если вы забыли, например #include <map> но использовать std::map возможно, что программа компилируется в любом случае молча и без предупреждений о конкретной версии конкретного компилятора, и вы можете получить ошибки только позже при переносе на другой компилятор или версию.

на мой взгляд, нет никаких допустимых технических оправданий, потому что это необходимо для общего пользователя: двоичный файл компилятора может иметь все стандартное пространство имен встроенный, и это может фактически увеличить производительность даже больше, чем предварительно скомпилированные заголовки (например, используя идеальный хеширование для поиска, удаление стандартных заголовков разбора или загрузки/демарширования и так далее).

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

однако именно так определяется язык, и вам нужно знать, какой заголовок определяет, какие имена так планируют некоторые дополнительные нейроны должны быть сожжены в бессмысленных конфигурациях, чтобы запомнить это (или попытаться найти и IDE, которая автоматически добавляет стандартные заголовки, которые вы используете, и удаляет те, которые вы не делаете... разумная альтернатива.)


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