Должен ли я также включать string .h даже он существует в заголовочном файле?

#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 включает ваш файл заголовка, вам не нужно включать его снова. Тем не менее, если вы это сделаете, это не должно причинить никакого вреда из-за включения защиты.