Обертывание #includes в #ifndef - добавляет какую-либо ценность?
-
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
в директивах <=> и получить секундомер ...