Почему этот код
std::map <std::string , int> m;
m["a"]=1;
компилируется с (я использую MSVC 2010)
#include <string>
но не с
#include <string.h>
?
Почему этот код
std::map <std::string , int> m;
m["a"]=1;
компилируется с (я использую MSVC 2010)
#include <string>
но не с
#include <string.h>
?
<string.h>
содержит старые функции, такие как strcpy
, strlen
для строк с нулевым завершением в стиле C.<string>
содержит в основном std::string
, std::wstring
и другие классы. string.h
- это заголовок C, а не заголовок С++, период!
<string.h>
- cstring - http://www.cplusplus.com/reference/clibrary/cstring/
<string>
- класс строк С++ - http://www.cplusplus.com/reference/string/
Редактировать комментарий Nicol Bolas ниже и немного поискового запроса:
<cstring>
обычно импортирует те же вещи, что и <string.h>
, но в пространство имен std
.
<string.h>
обычно импортирует все в глобальное пространство имен.
Похоже, что это зависит от используемой вами реализации библиотеки, но, согласно моему поисковому запросу.
Лично я использую только <cstring>
, если мне нужны помощники строки стиля C.
string.h
- это заголовочный файл C, а string
- файл заголовка С++.
<string.h>
содержит строковые функции библиотеки C. strlen
, strcmp
и т.д.
<string>
содержит определение для std::basic_string
, которое имеет typedefs std::string
и std::wstring
. Это различие.
У них действительно нет никаких отношений, кроме того, что они оба имеют дело со строками.
Это совершенно разные заголовки.
<string>
- это класс С++ string
<string.h> or <cstring>
определяет функции для управления строками и массивами C
Я считаю, что <string.h>
используется только для C и <string>
для С++. Поэтому включение string.h
не работает.
Как указано, string.h
и cstring
являются заголовками C (в то время как cstring
- это в основном С++-оболочка для string.h
), содержащая функции для строк C, которые char[]
завершены '\0'
. Вы хотите использовать строку класса С++, заголовок которой <string>
.