У меня есть простой заголовочный файл, в котором я объявляю все классы в пространстве имен, например.
#ifndef TEST_FWD_HPP
#define TEST_FWD_HPP
namespace a {
namespace b {
class A;
class B;
}
}
#endif
Если этот файл защищен от нескольких включений (#ifndef
…)? Имеет ли это смысл только для предварительных деклараций?
Обычно хорошей практикой является защита таких заголовочных файлов. В большинстве случаев нет необходимости, когда файл включается только один раз, но когда проект становится сложным, а файлы заголовков включаются в другие файлы заголовков, это может помочь вам сохранить здравый смысл.
Если у вас есть только предварительные определения и прототипы функций, то в этом обычно нет необходимости, но, поскольку заголовочные файлы имеют тенденцию со временем усугублять ситуацию, это часто стоит делать само собой разумеется.
Множественная защита включает не только несколько ошибок объявления. Вам нужно вставить эти элементы в каждый заголовочный файл, чтобы избежать бесконечного цикла включения.
Просто используйте (формально нестандартно) #pragma once
и покончим с этим.
В дополнение к предотвращению нескольких включений в одном и том же блоке перевода, защита заголовка или #pragma once
пусть сообразительный компилятор избегает повторного сканирования файла.