Valmond
Valmond

Reputation: 2969

Difference between <string> and <string.h>?

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

Answers (11)

Steven H
Steven H

Reputation: 63

  • edited after Adrian's comment
  1. 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.

  2. 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>
    
  3. 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>
    
  4. 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*)).

  1. 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

James Liu
James Liu

Reputation: 1

string.h is for c compatible c++ string class string is for pure c++ string class

Upvotes: 0

PankajSingh
PankajSingh

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

Ajay
Ajay

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

matiu
matiu

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

Sanish
Sanish

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

jpstrube
jpstrube

Reputation: 795

I believe <string.h> is just used for C and <string> for C++. So including string.h wont work.

Upvotes: 2

Zeta
Zeta

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

Nicol Bolas
Nicol Bolas

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

Prasoon Saurav
Prasoon Saurav

Reputation: 92864

string.h is a C header not a C++ header, period!

Upvotes: 24

shadyabhi
shadyabhi

Reputation: 17234

string.h is C's header file while string is C++'s header file.

Upvotes: 13

Related Questions