Обертывание #includes в #ifndef - добавляет какую-либо ценность?

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Я унаследовал С/C++, а в ряде файлов .cpp #include директивы заключены в #ifndef с внутренними одинарными заголовками include #define.

например

#ifndef _INC_WINDOWS
#include <windows.h>
#endif

и windows.h выглядит так

#ifndef _INC_WINDOWS
#define _INC_WINDOWS
...header file stuff....
#endif // _INC_WINDOWS

Я предполагаю, что это было сделано для ускорения компиляции/предобработки кода.

Я думаю, что это некрасиво и преждевременная оптимизация, но, поскольку время сборки проекта с нуля составляет 5 минут, я не хочу ухудшать ситуацию.

Так дает ли эта практика какую-либо ценность или значительно ускоряет процесс?Можно ли их чистить?

Обновлять:компилятор — MSVC (VS2005), платформа — Win32/WinCE.

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

Решение

Стоит знать, что некоторые реализации имеют #pragma once и/или оптимизацию обнаружения включения-заголовка, и что в обоих случаях препроцессор автоматически пропустит открытие, чтение или обработку файла заголовка, который он включил ранее.

Таким образом, в этих компиляторах, включая MSVC и GCC, эта «оптимизация» бессмысленна, и ответственность за обработку множественного включения должна лежать на файлах заголовков.Однако возможно, что это оптимизация для компиляторов, где #include очень неэффективен.Является ли код патологически переносимым и <windows.h> относится не к широко известному заголовочному файлу Win32, а к некоторому пользовательскому заголовочному файлу с тем же именем?

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

Редактировать:

Поскольку вы говорите, что вас волнует только MSVC, я бы либо:

  • сделайте массовое редактирование, запланируйте сборку, чтобы убедиться, что предыдущий программист не знает того, чего не знаю я.Может быть добавить #pragma once если это поможет.Используйте предварительно скомпилированные заголовки, если все это действительно замедляет работу.
  • Игнорируйте это, но не используйте защиту для новых файлов или для новых #includeдобавлено в старые файлы.

В зависимости от того, есть ли у меня более важные дела, о которых стоит беспокоиться.Это классическая пятничная дневная работа, я бы не стал тратить на нее потенциально продуктивное время ;-)

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

Если файл включен, то весь этот файл должен быть прочитан, и даже затраты на открытие / закрытие файла могут быть значительными. Поместив защитные директивы вокруг оператора include, его никогда не нужно открывать. Как всегда в случае с этими вопросами, правильный ответ таков: попробуйте снять защитные ограждения ifndef / endif в директивах <=> и получить секундомер ...

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