Как работает #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, которая автоматически добавляет стандартные заголовки, которые вы используете, и удаляет те, которые вы не делаете... разумная альтернатива.)
Это в основном файл заголовка, который включает в себя все стандартные библиотеки.
В соревнования по программированию, использование этого файла-хорошая идея, когда вы хотите уменьшить время, потраченное на выполнение домашних обязанностей; особенно когда ваш ранг чувствителен ко времени.
В соревнования по программированию, люди больше фокусируются на поиске алгоритма для решения проблемы, чем на программной инженерии.
Но в программного обеспечения перспектива, это не очень хорошая идея для использования. Если вы используете его на самом деле включает в себя много файлов, которые ваша программа может не понадобиться, таким образом увеличивает время компиляции и размер программы без необходимости.