STL basic_string, string, wstring, tstring

1.basic_string

basic_string也是一个STL中的sequence container。STL只有一个字符串类,basic_string。一个basic_string管理一个以0做结束符的字符串数组。字符的类型是basic_string模般的参数。总的来说,一个basic_string类型的变量应该被当作不透明的对象。你可以得到一个指向内部缓冲区的只读指针,但是任何写操作必须使用basic_string的操作符和方法。

2.string, wstring

string 和 wstring 均是使用 typedef 定义的模板类,基于 basic_string, 用它可以创建任何字符类型的字符串类。以下就是 STL 定义的 string 和 wstring:

<span style="font-size:18px;">typedef basic_string<char, char_traits<char>, allocator<char> >  string;
typedef basic_string<wchar_t, char_traits<wchar_t>,allocator<wchar_t> > wstring;</span>


3.TCHAR 和_T 

#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L ## x
#else
typedef char TCHAR;
#define __T(x) x
#endif
当你在工程设置中选择 Unicode 字符集时,编译器会用 _UNICODE 定义进行编译。如果你选择MBCS(多字节字符集),则编译器将不会带 _UNICODE 定义 。一切取决于_UNICODE 的值。同样,每一个使用字符指针的 Windows API 函数会有一个 A(ASCII) 和一个 W(Wide/Unicode) 版本,这些版本的 实际定义也是根据 _UNICODE 的值来决定:

#ifdef UNICODE
#define CreateFile CreateFileW
#else
#define CreateFile CreateFileA
#endif
同样,_tprintf 和 _tscanf 对应于 printf 和 scanf。所有带"t"的版本使用 TCHARs 取代了chars。那么怎样把以上的这些应用到 std::string 上呢?很简单。STL已经定义了string和wstring,基于string 和wstring定义一个tstring。

4.tstring

tstring 是基于string 和wstring 用typedef来定义的,如下:      

#ifdef _UNICODE 
	typedef wstring tstring;
#else
	typedef string tstring;
#endif

一旦定义了 tstring,便可以像下面这样编码:

       tstring s = _T("Hello, world");

       _tprintf(_T("s =%s\n"),s.c_str());

  basic_string::c_str 方法返回一个指向潜在字符类型的常量指针;在这里,该字符类型要么是const char*,要么是 const wchar_t*。



阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页