bits stdc h что это

How does #include work in C++? [duplicate]

I have read from a codeforces blog that if we add #include in a C++ program then there is no need to include any other header files. How does #include work and is it ok to use it instead of including individual header files?

4 Answers 4

It is basically a header file that also includes every standard library and STL include file. The only purpose I can see for it would be for testing and education.

Using it would include a lot of unnecessary stuff and increases compilation time.

Edit: As Neil says, it’s an implementation for precompiled headers. If you set it up for precompilation correctly it could, in fact, speed up compilation time depending on your project. (https://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html)

I would, however, suggest that you take time to learn about each of the sl/stl headers and include them separately instead, and not use «super headers» except for precompilation purposes.

#include is an implementation file for a precompiled header.

From, software engineering perspective, it is a good idea to minimize the include. If you use it actually includes a lot of files, which your program may not need, thus increase both compile-time and program size unnecessarily. [edit: as pointed out by @Swordfish in the comments that the output program size remains unaffected. But still, it’s good practice to include only the libraries you actually need, unless it’s some competitive competition ]

But in contests, using this file is a good idea, when you want to reduce the time wasted in doing chores; especially when your rank is time-sensitive.

It works in most online judges, programming contest environments, including ACM-ICPC (Sub-Regionals, Regionals, and World Finals) and many online judges.

The disadvantages of it are that it:

That header file is not part of the C++ standard, is therefore non-portable, and should be avoided.

Moreover, even if there were some catch-all header in the standard, you would want to avoid it in lieu of specific headers, since the compiler has to actually read in and parse every included header (including recursively included headers) every single time that translation unit is compiled.

Unfortunately that approach is not portable C++ (so far).

All standard names are in namespace std and moreover you cannot know which names are NOT defined by including and header (in other words it’s perfectly legal for an implementation to declare the name std::string directly or indirectly when using #include ).

Despite this however you are required by the language to know and tell the compiler which standard header includes which part of the standard library. This is a source of portability bugs because if you forget for example #include but use std::map it’s possible that the program compiles anyway silently and without warnings on a specific version of a specific compiler, and you may get errors only later when porting to another compiler or version.

In my opinion there are no valid technical excuses that explain why this is necessary for the general user: the compiler binary could have all standard namespace built in and this could actually increase the performance even more than precompiled headers (e.g. using perfect hashing for lookups, removing standard headers parsing or loading/demarshalling and so on).

Читайте также:  какой нормативный правовой акт является подзаконным тест

The use of standard headers simplifies the life of who builds compilers or standard libraries and that’s all. It’s not something to help users.

However this is the way the language is defined and you need to know which header defines which names so plan for some extra neurons to be burnt in pointless configurations to remember that (or try to find and IDE that automatically adds the standard headers you use and removes the ones you don’t. a reasonable alternative).

Источник

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

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

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

К недостаткам можно отнести:

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

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

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

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

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

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

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

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

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

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

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

Источник

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

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

5 ответов

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

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

К недостаткам можно отнести:

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

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

Причина, по которой мы не используем:

Это из-за эффективности. Позвольте мне провести аналогию: Для тех из вас, кто знает Java: если вы спросите своего инструктора, было ли это хорошей идеей, если они не плохой инструктор, они ответят нет:

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

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

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

Читайте также:  рулевая тяга ниссан патрол 61 какие лучшие

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

также содержит предупреждение:

Существует сайт Stack Exchange под названием Программирование головоломок и кодового гольфа. Загадки программирования на этом сайте подходят под это определение головоломки:

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

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

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

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

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

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

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

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

Всем, кто пишет такие «руководства»

Источник

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

Я прочитал из блога Codeforces, что если мы #include в C++ Программа, то нет необходимости включать какие-либо другие файлы заголовков. как #include работает и нормально ли его использовать вместо включения отдельных заголовочных файлов?

6 ответов

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

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

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

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

#include файл реализации для предварительно скомпилированного заголовка

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

Читайте также:  с днем торговли какой день

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

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

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

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

Все стандартные имена находятся в пространстве имен std и, кроме того, вы не можете знать, какие имена НЕ определены путем включения и заголовка (другими словами, для реализации вполне законно объявлять имя std::string прямо или косвенно при использовании #include ).

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

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

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

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

Источник

#include с Visual Studio не компилируется

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

5 ответов

Есть ли способ избежать этой ошибки?

Да: не используйте нестандартные файлы заголовков, которые предоставляются только GCC, а не компилятором Microsoft.

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

Установите последнюю версию MinGW. Вот версия 6.3.0. Найдите руководство по установке здесь.

Обратите внимание, что это будет «Сообщество» / «Профессионал» в зависимости от установки VS и лицензирования.

Я отвечу за Enterprise 2015, версия 4.8.03761, обновление 3.

Когда вы устанавливали кодовые блоки, также был установлен MinGW ((Min) минималистичный (G) Сборник компиляторов GNU (GCC) для (W) Windows). Или вы можете установить его отдельно.

Вам нужно перейти в этот каталог и вставить всю папку бит из вашей установки MinGW, моя была в (C: \ MinGW \ lib \ gcc \ mingw32 \ 8.2.0 \ include \ c ++ \ mingw32).

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

Чтобы использовать препроцессор bits/stdc++.h в Visual Studio, вам необходимо загрузить файл stdc++.h по указанной ниже ссылке.

Источник

Сказочный портал