Разница между <cstring> и <string>
Ранее сегодня (фактически вчера из-за моего часового пояса) я пытался провести собеседование по программированию с помощью Visual Studio 2012 для С++ на странице интервью (которая использует g++).
Чтобы быть кратким, я столкнулся с несколькими ошибками компиляции 1 когда я использовал
#include <cstring>
который был предоставлен скелетным кодом в одном из вопросов, и после обращения к
#include <string>
все ошибки компиляции магически исчезли.
Однако, после отправки на "Интервью-стрит", мне пришлось добавить c
назад; в противном случае я получил ошибки компиляции.
Это был первый раз, когда я был укушен нестандартизацией....
Мой вопрос: что внутри <string>
и <cstring>
взяло меня (драгоценное) более получаса?
1 Для всех, кто любопытен:
Одна ошибка Visual Studio 2012, если using <cstring>
:
ошибка C2338: стандарт С++ не предоставляет хэш для этого типа.
в
c:\program files (x86)\microsoft visual studio 11.0\vc\include\xstddef
возможно для string
в качестве ключа в unordered_map
Одна ошибка g++, если using <string>
:
'strlen' не был объявлен в этой области
Ответы
Ответ 1
Заголовок cstring
предоставляет функции для обработки строк C-стиля - массивы символов с нулевым символом. Сюда входят такие функции, как strlen
и strcpy
. Это версия С++ классического заголовка string.h
с C.
Заголовок string
предоставляет класс std::string
и связанные с ним функции и операторы.
Заголовки имеют похожие имена, но на самом деле они не связаны друг с другом. Они охватывают отдельные задачи.
Ответ 2
<cstring>
имеет строковый код C из заголовка C. string.h. C++
имеет соглашение, в котором заголовки C
имеют одно и то же базовое имя, за исключением ведущего C
и конечного .h
. Все содержимое доступно в пространстве имен std::
.
<string>
имеет стандартную библиотеку std::string
и связанные функции
Ответ 3
В С++ вы не использовали бы #include <somefile.h>
, а вместо этого #include <somefile>
. Теперь С++ имеет свои строковые классы в <string>
, но также доступны функции c-string, которые будут находиться в <string.h>
. С++ использует для традиционных файлов c-include. Поэтому <cstring>
и <string>
http://www.cplusplus.com/reference/clibrary/cstring/