Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

С++ Подключение заголовочных. Правильно ли так?

#cpp


Можно ли так делать. Создал STD_INCLUDES.h, который кругом подключаю заместо кучи
инклюдов, в нем содержимое такого типа:

#pragma once
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

    


Ответы

Ответ 1



Это работает, это удобно. Но только в маленьких проектах. У вас нарастает функционал, вы включаете в этот хедер все больше и больше других, и может настать момент, когда сборка проекта будет занимать куууууучу времени. Это происходит по той причине, что каждый заголовок вставляется в файл, в котором вы его include-те, и компилятору приходится обрабатывать тонны кода, который тут и вовсе ни к чему. К тому же, если вы решите, что вам что-то из инклюдов уже не нужно, уберете это из файла со всеми заголовками, у вас может что-то сломаться. И если проект большой, то это такая головная боль... Поэтому совет - включайте лишь необходимые заголовки. В виде исключения - можете собрать в один заголовок те заголовочные файлы, которые часто используются вместе. Например в физическом движке Box2D есть заголовок Box2D.h, который имеет вид: #include "Box2D/Common/b2Settings.h" #include "Box2D/Common/b2Draw.h" ..... #include "Box2D/Dynamics/Joints/b2WeldJoint.h" #include "Box2D/Dynamics/Joints/b2WheelJoint.h" Потому что вы, скорее всего, не будете использовать какой-то один компонент отдельно от всего движка, и вам проще подключить один заголовок. Вот дубликат с англоязычного стака. Кстати, существует еще такая практика, как предварительно откомпилированные заголовки (precompiled headers). Подробнее о них можно почитать, к примеру, тут.

Ответ 2



Это имеет смысл, если вы используете предкомпилированные заголовки, а вот такой заголовок идет первым, без каких бы то ни было #define'ов или #include'ов перед ним - тогда все это будет предкомпилировано, что может даже ускорить работу. Просто так тягать за собой всю библиотеку, если нужен, скажем, только вывод в cout - смысла нет. Даже с предкомпиляцией... "По-моему, так" (с) Пух Сошлюсь на авторитетов :) - "Шаблоны С++" Вандевурда-Джосаттиса- Грегора от 2017 года. Цитирую: Некоторые программисты считают, что лучше включить в файл некоторые дополнительные ненужные заголовочные файлы, но обеспечить возможность ускорить трансляцию за счет использования предкомпилированного заголовочного файла. Такое решение может существенно облегчить управление стратегией включения. Например, обычно относительно просто создать заголовочный файл с именем std.hpp, который включает в себя все стандартные заголовки: #include #include #include #include #include ... Затем этот файл может быть предкомпилирован, и каждый файл программы, использующий стандартную библиотеку, просто начинается следующим образом: #include "std.hpp" ... Обычно это требует некоторого времени для предкомпиляции, но в системе с достаточным объемом памяти схема с предкомпилированным заголовочным файлом позволяет работать значительно быстрее, чем требуется почти любому стандартному заголовочному файлу без предварительной компиляции. Стандартные заголовочные файлы особенно удобно использовать таким образом, потому что они редко изменяются, а следовательно, предкомпилированный заголовочный файл для файла std.hpp может быть построен один раз. В противном случае предкомпилированные заголовочные файлы обычно являются частью конфигурации зависимостей проекта (например, обновляются по мере необходимости популярной программой make или соответствующим инструментарием интегрированной среды разработки (IDE)). Одним из привлекательных подходов к управлению предкомпилированными заголовочными файлами является создание слоев предкомпилированных заголовочных файлов, которые образуются из наиболее широко используемых и стабильных заголовочных файлов (как, например, наш заголовочный файл std.hpp), для которых не ожидается внесение изменений, а потому имеет смысл их предварительная компиляция. Однако, если заголовочные файлы находятся в постоянном развитии, их предкомпиляция может потребовать больше времени, чем даст экономия при повторном их использовании. Ключевой концепцией этого подхода является то, что предкомпилированные заголовочные файлы более стабильного слоя могут быть повторно использованы для улучшения времени компиляции менее стабильных заголовочных файлов. Предположим, например, что в дополнение к нашему заголовочному файлу std.hpp (который мы предварительно скомпилировали), мы также определили заголовочный файл core.hpp, который включает дополнительные возможности, специфичные для нашего проекта, но тем не менее достигшие определенного уровня стабильности: #include "std.hpp" #include "core_data.hpp" #include "core_algos.hpp" ... Поскольку этот файл начинается с #include "std.hpp", компилятор может загрузить соответствующий предкомпилированный заголовок и продолжить работу со следующими строками без перекомпиляции всех стандартных заголовков. Когда файл будет полностью обработан, может быть создан новый предкомпилированный заголовочный файл. Затем приложения могут использовать #include "core.hpp" для обеспечения быстрого доступа к большому количеству функциональности, потому что компилятор может загрузить последний предкомпилированный заголовочный файл. Простите за обильное цитирование :)

Комментариев нет:

Отправить комментарий