Итак, у меня недавно было обсуждение, где я работаю, в котором я задавал вопрос об использовании double include guard для одного охранника. Я имею в виду двойную защиту:
Заголовочный файл, "header_a.hpp":
#ifndef __HEADER_A_HPP__
#define __HEADER_A_HPP__
...
...
#endif
При включении файла заголовка в любом месте, в заголовке или исходном файле:
#ifndef __HEADER_A_HPP__
#include "header_a.hpp"
#endif
Теперь я понимаю, что использование защиты в заголовочных файлах - это предотвращение множественного включения уже определенного файла заголовка, это общепринятое и хорошо документированное. Если макрос уже определен, весь заголовочный файл рассматривается как "пустым" компилятором, а двойное включение предотвращается. Достаточно просто.
Проблема, которую я не понимаю, использует #ifndef __HEADER_A_HPP__
и #endif
вокруг #include "header_a.hpp"
. Мне сказал коллега, что это добавляет второй уровень защиты к включениям, но я не вижу, как этот второй уровень даже полезен, если первый уровень полностью выполняет работу (или делает это?).
Единственное, что я могу придумать, это то, что он полностью останавливает компоновщика от поиска, чтобы найти файл. Это значит улучшить время компиляции (которое не упоминалось как преимущество), или есть что-то еще здесь, что я не вижу?