Reputation: 2969
How come this code
std::map <std::string , int> m;
m["a"]=1;
compiles with (I'm using MSVC 2010)
#include <string>
but not with
#include <string.h>
?
Upvotes: 68
Views: 79348
Reputation: 63
In C, to use the old C-style string features (including strlen(char*)
), we write this:
// C
#include <string.h>
And this is the only way in C. Including this header will define and declare some actual functions (like strlen
, strcmp
, ...) in the global scope.
And such way of inclusion continues in C++, as the C++ compilers are supposed to be compatible with the most (99%) of C codes. The following identical code includes the old C-style string features (including strlen(char*)
):
// C++
#include <string.h>
In C++ to avoid confusion, as the language team renamed the old headers to put away as legacy, we are recommended to write this, rather than 2.:
// C++
#include <cstring.h>
Or, as C++ prefers to omit the ".h" at the end, we write this,
// C++
#include <cstring>
Summary: 1., 2., 3., and 4. are the same thing indicating the old C style string features (including strlen(char*)
).
On the other hand, C++ has a new objective container class named std::string
, and to include the new C++ style string class , we write:
// C++
#include <string>
Summary: 5. is the only way to bring the new C++ features of string class named std::string
.
Plot twister: <string>
in itself imports <cstring>
(in most compilers). Therefore, for using the old C-style string features, all five examples I've presented will work without error. For using the new C++ string class, again, <string>
is the only way.
Upvotes: 1
Reputation: 1
string.h is for c compatible c++ string class string is for pure c++ string class
Upvotes: 0
Reputation: 11
<string.h>
is a C standard library header while <string>
is a cpp in fact all the c standard header files have .h
extension an non of cpp have .h
.
Upvotes: 0
Reputation: 18431
<string.h>
contains old functions like strcpy
, strlen
for C style null-terminated strings. <string>
primarily contains the std::string
, std::wstring
and other classes.Upvotes: 109
Reputation: 7725
<string.h>
is cstring - http://www.cplusplus.com/reference/clibrary/cstring/
<string>
is the c++ string class - http://www.cplusplus.com/reference/string/
Edit per Nicol Bolas comment below and a bit of googling:
<cstring>
will usually import the same things as <string.h>
but into the std
namespace.
<string.h>
will usually import everything into the global namespace.
It appears to depend on the library implementation you're using though according to my googling.
Personally I only ever use <cstring>
if I need C style string helpers.
Upvotes: 18
Reputation: 1719
They are entirely different headers.
<string>
is C++ string
class
<string.h> or <cstring>
defines functions to manipulate C strings and arrays
Upvotes: 5
Reputation: 795
I believe <string.h>
is just used for C and <string>
for C++. So including string.h
wont work.
Upvotes: 2
Reputation: 105885
As stated, string.h
and cstring
are C headers (while cstring
is basically a C++ wrapper for string.h
), containing functions for C strings, which are char[]
terminated by '\0'
. You want to use the c++ class string, which header is <string>
.
Upvotes: 3
Reputation: 473537
<string.h>
contains C-library string functions. strlen
, strcmp
, etc.
<string>
contains the definition for std::basic_string
, which has the typedefs std::string
and std::wstring
. That's the difference.
They really have no relationship at all, outside of the fact that they both deal with strings.
Upvotes: 9
Reputation: 17234
string.h
is C's header file while string
is C++'s header file.
Upvotes: 13