«Защита от избыточности», как вы ее называете, ускоряет компиляцию.
Без избыточной защиты компилятор будет перебирать весь файл foo.h в поисках некоторого кода, который может находиться за пределами блока #ifndef
. Если это длинный файл, и это делается во многих местах, компилятор может тратить много времени. Но с избыточной защитой он может пропустить весь оператор #include
и даже не открыть этот файл.
Конечно, вам придется поэкспериментировать и увидеть фактическое количество времени, потраченное компилятором на итерацию по foo.h и фактически не компилирующую ничего; и, возможно, современные компиляторы действительно ищут этот шаблон и автоматически знают, что вообще не нужно открывать файл, я не знаю.
(начать редактирование с помощью 280Z28)
Следующая структура заголовка распознается как минимум GCC и MSVC. Использование этого шаблона сводит на нет практически все преимущества, которые вы можете получить с помощью охранников во включаемых файлах. Обратите внимание, что комментарии игнорируются, когда компилятор проверяет структуру.
// GCC will recognize this structure and not reopen the file
#ifndef SOMEHEADER_H_INCLUDED
#define SOMEHEADER_H_INCLUDED
// Visual C++ uses #pragma once to mark headers that shouldn't be reopened
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
# pragma once
#endif
// header text goes here.
#endif
(конец редактирования)