Совет 48. Всегда включайте нужные заголовки
Совет 48. Всегда включайте нужные заголовки
При программировании в STL нередко встречаются программы, которые успешно компилируются на одной платформе, но требуют дополнительных директив #include на другой. Этот раздражающий факт связан с тем, что Стандарт С++ (в отличие от Стандарта С) не указывает, какие стандартные заголовки могут или должны включаться в другие стандартные заголовки. Авторы реализаций пользуются предоставленной свободой и выбирают разные пути.
Попробую пояснить, что это значит на практике. Однажды я засел за пять платформ STL (назовем их А, В, С, D и Е) и попробовал экспериментальным путем определить, какие стандартные заголовки можно убрать, чтобы программа при этом нормально компилировалась. По этим данным становится ясно, какие заголовки включают другие заголовки директивой #include. Вот что я узнал:
•на платформах А и С <vector> включает <string>;
•на платформе С <algorithm> включает <string>;
•на платформах С и D <iostream> включает <iterator>;
•на платформе D <iostream> включает <string> и <vector>;
•на платформах D и Е <string> включает <algorithm>;
•во всех пяти реализациях <set> включает <functional>
За исключением последнего случая мне так и не удалось провести программу с убранным заголовком мимо реализации В. По закону Мэрфи вам всегда придется вести разработку на таких платформах, как А, С, D и Е, и переносить программы на такие платформы, как В, особенно когда это очень важная работа, которую необходимо сделать как можно скорее. Так бывает всегда.
Но не стоит осуждать компиляторы или разработчиков библиотек за трудности с переносом. Пропущенные заголовки на вашей ответственности. При каждой ссылке на элементы пространства имен std вы также отвечаете за включение соответствующих заголовков. Если заголовки опущены, программа теоретически может откомпилироваться, но другие платформы STL имеют полное право отвергнуть ваш код.
Чтобы вам было проще запомнить необходимые заголовки, далее приведена краткая сводка содержимого всех стандартных заголовков, относящихся к STL.
•Почти все контейнеры объявляются в одноименных заголовках, то есть vector объявляется в заголовке <vector>, list объявляется в заголовке <list> и т. д. Исключениями являются <set> и <map>. В заголовке <set> объявляются контейнеры set и multiset, а в заголовке <map> объявляются контейнеры map и multimap.
•Все алгоритмы, за исключением четырех, объявляются в заголовке <algorithm>. Исключениями являются алгоритмы accumulate (см. совет37), inner_poduct, adjacent_difference и partial_sum. Эти алгоритмы объявляются в заголовке <numeric>.
•Специализированные разновидности итераторов, включая istream_iterator и streambuf_iterator (см. совет 29), объявляются в заголовке <iterator>.
•Стандартные функторы (например less<T>) и адаптеры функторов (например not1 и bnd2nd) объявляются в заголовке <functional>.
Не забывайте включать соответствующую директиву #include при использовании любых из перечисленных компонентов, даже если платформа разработки позволяет обойтись и без нее. Ваше прилежание непременно окупится при переносе программы на другую платформу.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Заголовки
Заголовки Браузеры еще не начали поддерживать новый алгоритм содержания в HTML5, но вы все равно можете начать использовать доступные вам дополнительные уровни заголовков.Джоффри Снеддон (Geoffrey Sneddon) написал очень полезную онлайн-утилиту, которая сгенерирует содержание
Заголовки
Заголовки Помимо абзацев, большой текст для удобства чтения и поиска в нем нужного фрагмента обычно делят на более крупные части: параграфы, главы, разделы. HTML не предоставляет средств для такого структурирования текста. Но он позволяет создать заголовки, которые делят
Заголовки
Заголовки Использование системных функций обычно требует включения в текст программы файлов заголовков, содержащих определения функций — число передаваемых аргументов, типы аргументов и возвращаемого значения. Большинство системных файлов заголовков расположены в
3.1 ЗАГОЛОВКИ БУФЕРА
3.1 ЗАГОЛОВКИ БУФЕРА Во время инициализации системы ядро выделяет место под совокупность буферов, потребность в которых определяется в зависимости от размера памяти и производительности системы. Каждый буфер состоит из двух частей: области памяти, в которой хранится
Заголовки
Заголовки Помимо абзацев, большой текст для удобства чтения и поиска в нем нужного фрагмента обычно делят на более крупные части: параграфы, главы, разделы. HTML не предоставляет средств для такого структурирования текста. Но он позволяет создать заголовки, которые делят
Заголовки
Заголовки Корректные заголовки, кратко отражающие общую тематику, облегчают поиск Internet-ресурсов. Использование каждого слова в названиях страниц следует тщательно обдумать. Очень важно грамотно составить начальные фразы; это требование особенно касается текста внутри
Заголовки
Заголовки Обычно в каждом тексте имеются заголовки разных уровней. Самый крупный заголовок называется заголовком 1-го уровня, самый маленький — 6-го. Тегами заголовков служат парные теги <Hn> и </Hn>, где n — номер уровня заголовка. Вернемся к нашему шаблону shablon.html и
1.4. Заголовки
1.4. Заголовки Текст работы обычно разбивается на структурные части: содержание, введение, разделы и подразделы, выводы, список использованных источников, приложения. Разделы нумеруют арабскими цифрами, начиная с единицы. В заголовке раздела указывают его номер, после
19.2.1.7. Включайте в код полезные комментарии
19.2.1.7. Включайте в код полезные комментарии Куратор хочет иметь полную уверенность в том, что понимает вносимые заплатой изменения, прежде чем объединить их с основным кодом. Данное правило не является неизменным. Если создатель заплаты имеет стаж хорошей работы с
19.2.4.2. Включайте в дистрибутив README-файл
19.2.4.2. Включайте в дистрибутив README-файл В дистрибутив программы следует включать файл README, который является путеводителем по дистрибутиву. Согласно давнему соглашению (созданному самим Деннисом Ритчи до 1980 года, и распространенному в Usenet в начале 1980-х годов), данный файл
19.2.1.8. Включайте в код полезные комментарии
19.2.1.8. Включайте в код полезные комментарии Куратор хочет иметь полную уверенность в том, что понимает вносимые заплатой изменения, прежде чем объединить их с основным кодом. Данное правило не является неизменным. Если создатель заплаты имеет стаж хорошей работы с
19.2.4.2. Включайте в дистрибутив README-файл
19.2.4.2. Включайте в дистрибутив README-файл В дистрибутив программы следует включать файл README, который является путеводителем по дистрибутиву. Согласно давнему соглашению (созданному самим Деннисом Ритчи до 1980 года, и распространенному в Usenet в начале 1980-х годов), данный файл
Надписи и заголовки
Надписи и заголовки При всем многообразии шрифтов, которые вы можете использовать в Word, и при всех возможностях форматирования иногда нам все-таки требуется нечто большее. Например, необходимо создать по-настоящему красивый, фигурный заголовок для нашего письма или
1.4. Заголовки
1.4. Заголовки Текст работы обычно разбивается на структурные части: содержание, введение, выводы, список использованных источников, приложения, а также на разделы и подразделы. Разделы нумеруют арабскими цифрами, начиная с единицы. В заголовке раздела указывают его номер,