Подтвердить что ты не робот

Разница между <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' не был объявлен в этой области

4b9b3361

Ответ 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/