Включение библиотеки в заголовочный файл и файл cpp - PullRequest
0 голосов
/ 23 февраля 2019

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

test.h

#include <string>
.
.
.

test.cpp

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

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

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

Да.Обычно заголовок включается в несколько файлов.

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

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

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

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

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

0 голосов
/ 23 февраля 2019

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

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

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

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