Включение библиотеки как в заголовочный файл, так и в файл cpp

Я новичок в С++. Я видел код, который включает файл библиотеки (например, string) как в заголовке, так и в файле cpp. Приведет ли это к дублированию кода, если #ifndef не используется? или препроцессор достаточно умен, чтобы игнорировать его. Нормально ли включать одну и ту же библиотеку в оба файла?

тест.ч

#include <string>
.
.
.

test.cpp

#include <string>
#include "test.h"
.
.
.


person Alex    schedule 23.02.2019    source источник
comment
<string> будет своя ifndef охрана.   -  person Sam Varshavchik    schedule 23.02.2019
comment
Кроме того, если вам не нужно что-то из <string> в заголовке, нормально просто включить это в файл реализации.   -  person Devan Buggay    schedule 23.02.2019


Ответы (2)


Все заголовочные файлы стандартной библиотеки C++ имеют защиту ifndef. Безопасно включать их в несколько файлов.

Эмпирическое правило заключается в том, чтобы включать файл везде, где необходимы его определения. Это означает, что если вы используете std::string в файлах h и cpp, включите <string> в оба.

Для любого из ваших собственных заголовочных файлов вы всегда должны использовать ifndef защиты для той же цели.

person Kon    schedule 23.02.2019
comment
assert.h и cassert не имеют встроенной защиты. Их можно включать несколько раз с разными эффектами в зависимости от того, определен ли макрос NDEBUG в точке включения заголовка. - person Pete Becker; 23.02.2019

Нормально ли включать одну и ту же библиотеку в оба файла?

Да. Включение заголовка в несколько файлов является нормальным явлением.

Всякий раз, когда вы используете объявление из заголовка, вы должны включать этот заголовок. Если вы используете std::string в test.h, то вы должны включить <string> в test.h. Если вы используете std::string в test.cpp, то вы должны включить <string> в test.cpp. Включение <string> в один из заголовков, включенных test.cpp, не имеет значения, и на это не следует полагаться.

Приведет ли это к дублированию кода, если #ifndef не используется?

Если заголовок не имеет защиты заголовка, то включение его несколько раз действительно приведет к дублированию его содержимого, да.

или препроцессор достаточно умен, чтобы игнорировать его.

Препроцессор не игнорирует включения. Каждое включение будет обработано. Препроцессор может быть достаточно умен, чтобы оптимизировать включение заголовка, который, как он знает, будет пустым из-за защиты включения.

person eerorika    schedule 23.02.2019