Упаковка #include в # ifndef's - добавляет какое-либо значение? - PullRequest
4 голосов
/ 20 июня 2009

Я унаследовал C / C ++ кодовую базу, и в ряде файлов .cpp директивы #include заключены в # ifndef с внутренним одиночным заголовком, включающим #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

Ответы [ 2 ]

8 голосов
/ 20 июня 2009

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

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

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

Edit:

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

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

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

2 голосов
/ 20 июня 2009

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

...