Является ли хорошей практикой избавление от #include
и использование только ключевого слова import
даже для заголовков (например, <span>
или "Foo.h"
)? Есть ли в этом какие-то преимущества? Возможные минусы? Увеличивает ли это время сборки?
cppreference имеет пример, в котором он говорит следующее:
import <set>; // imports a synthesized header unit formed from header
Что именно означает синтезированный в этом контексте?
Are there any benefits to this?
Импорт синтезированных блоков заголовков вместо включения заголовка может удовлетворить руководство по стилю, которое хочет использовать один тип директивы как для модулей, так и для заголовков.
Any possible downsides?
Он не будет работать ни в коде, предшествующем C++20, ни в компиляторах, которые еще не реализовали импорт файлов заголовков. Это не имеет значения, если вы также используете модули, поскольку они также не будут работать до C++20.
@digito_evo Да, заголовок будет предварительно обработан.
Целью этой функции является компиляция заголовка (включая, например, предварительную обработку и синтаксический анализ, но не все экземпляры шаблона) однажды, а не один раз для каждой единицы перевода, которая его использует. Это работает только в том случае, если ваши файлы заголовков «хорошо себя ведут» в том смысле, что они включают все, что им нужно (что не считается хорошей идеей с повсеместно) и не содержат зависеть в порядке включения или определениях внешних макросов. Это, как правило, делает первую импортирующую единицу перевода немного медленнее, но значительно ускоряет создание любых импортеров последующий.
«Синтезированный» относится к тому факту, что компилятор действует так, как если бы заголовочный файл был файлом источник, который был направлен для компиляции отдельно, а не просто как часть единицы трансляции.
Ницца. Другой вопрос, играет ли роль препроцессор при использовании
import
?