Небольшой вопрос о предварительно скомпилированных заголовках

StackOverflow https://stackoverflow.com/questions/1200021

  •  05-07-2019
  •  | 
  •  

Вопрос

Глядя на базу с открытым исходным кодом, я наткнулся на этот код:

#include "StableHeaders.h"
#include "polygon.h"
#include "exception.h"
#include "vector.h"
...

Теперь StableHeaders.h - это предварительно скомпилированный заголовок, который включен cpp 'control' для принудительной генерации. Три включения, которые появляются после предварительно скомпилированного заголовка, также все равно включаются в файл StableHeaders.h. Мой вопрос заключается в том, включены ли эти файлы дважды, чтобы база кода строилась на компиляторах, которые не поддерживают предварительно скомпилированные заголовки? Так как я предполагаю, что кэширование include / guards / заголовок в любом случае сделает множественные включения избыточными ...

EDIT . Кстати, в файле stableheaders.h есть проверка на win32 (примерно), поэтому я снова предполагаю, что include внутри stableheaders.h не будет включен в компиляторы, которые не поддерживают предварительно скомпилированные заголовки.

Это было полезно?

Решение

Компиляторы, которые не поддерживают предварительно скомпилированные заголовки, просто включили бы StableHeaders.h и повторно обрабатывали его каждый раз (вместо использования предварительно скомпилированного файла). Это не вызовет никаких проблем и не решит проблемы для определенных компиляторов, как вы просили. Я думаю, что это просто небольшая «ошибка», которая, вероятно, произошла со временем во время разработки.

Другие советы

Я думаю, что вы сами ответили на вопрос! Предварительно скомпилированные заголовки - это функция компилятора. Если присутствует охрана, заголовки не будут включены дважды, во всяком случае.

Единственная причина, по которой я могу придумать, чтобы защитить предварительно скомпилированный заголовок и включить его в любом случае, это скорость. Причина использования предварительно скомпилированных заголовков состоит в том, чтобы ускорить время компиляции, это работает путем включения и компиляции содержимого предварительно скомпилированного заголовка, когда вы делаете это, вы можете включать заголовки, которые используются только в 75% исходных файлов, и это все еще быстрее, чем не скомпилированные заголовки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top