#c
#c
Вопрос:
У меня проблемы с пониманием процесса создания класса в cpp.
Если я включил строку в файл заголовка, должен ли я также включать тот же файл заголовка в файл cpp, который реализует файл заголовка?
Комментарии:
1. Вы действительно не должны использовать
<string.h>
в C … Для строк C это<string>
и для функций, которые работают со строками в стиле<cstring>
C.2. не совсем понятно, о чем вы говорите. Так ли это
std::string
? В общем, вам нужно включить то, что вы используете. Если какой-то заголовок содержит второй заголовок, и вы включаете первый, тогда нет необходимости также включать второй, но иногда вы должны… Можете ли вы показать какой-нибудь код?3. Если ваш cpp-файл
#include
является заголовочным файлом, он неявно#include
будет использовать любые заголовки#include
, разделяемые этим заголовочным файлом. Так обычно работает препроцессор. (Это можно предотвратить, например, с помощью заголовка, используя условное включение, но — если вы не сделали это намеренно — это не повлияет на вас. Такие вещи не происходят по умолчанию).
Ответ №1:
Если вы используете объявление или определение из заголовка, вы должны включить этот заголовок. Включение заголовка транзитивно включает все заголовки, включенные в этот заголовок.
Вы никогда не должны полагаться на транзитивное включение из заголовка, который не контролируется вами (т. Е. Стандартные заголовки или заголовки библиотеки), потому что эти включения могут меняться в разных версиях. Плохой дизайн — полагаться на транзитивные включения ваших собственных заголовков, если они не задокументированы должным образом, поскольку такая зависимость создает невидимые зависимости.
PS. <string.h>
устарел в пользу <cstring>
заголовка.
PPS. <string.h>
не определяет std::string
. Это в заголовке <string>
.
Ответ №2:
Нет, если файл cpp включает ваш файл заголовка, вам не нужно включать его снова. Тем не менее, если вы это сделаете, это не должно причинить никакого вреда из-за включения защиты.