分类: WINDOWS
2011-11-17 15:54:32
http://blog.csdn.net/norains/article/details/3215934
//========================================================================
//TITLE:
// string也可以很精彩
//AUTHOR:
// norains
//DATE:
// Moday 03-November-2008
//Environment:
// NONE
//========================================================================
对于习惯于MFC架构的朋友来说,估计直接采用API方式写代码最痛苦的莫过于没有CString。其实,在STL里面,我们依然还有std::string可用,虽然在某些程度中不及CString便利,但也能勉强聊胜于无了。
1.宏定义
在WinCE编程中,我们几乎很少直接使用wchar_t,对于char也是如此。取而代之,我们更倾向于微软的建议:TCHAR----没办法,谁让wince是微软的产品呢?但既然都已经上了这贼船,那么我们不妨也入乡随俗一把,将std::string也做类似的定义吧:
#ifdef UNICODE
#ifndef TSTRING
#define TSTRING std::wstring
#endif
#else
#ifndef TSTRING
#define TSTRING std::string
#endif
#endif
带来的另外一个好处是,我们可以少敲打四次键盘。从延长键盘寿命的角度考虑,这也算是一大贡献。好吧,为了我的键盘能够服役得更久一些,接下来的内容,我都会直接采用TSTRING替代。
2.初始化
初始化的方式多种多样,一般会有如下:
TSTRING strA = TEXT("A");
TSTRING strB(TEXT("B"));
如果和容器打交道,那其实也很简单:
std::vector
TSTRING strC(vtC.begin(),vtC.end());
3.赋值
初始化简单,赋值也不会差哪里去:
strA = TEXT("A2");
TCHAR szB[] = TEXT("B2");
strB = szB;
和容器打交道,同样也是简单:
strC = &vtC[0];
4.追加
让我们回忆一下纯粹用数组的日子,如果想要在一固定的数组后面追加字符串,那么我们首先要分配一个足够大的空间,然后赋值旧的数值,最后再追加新值。也许很多人对下面这段伪代码记忆犹新:
TCHAR *pBuf;
...
TCHAR *pNew = new TCHAR[_tcslen(pBuf) + TEXT("Append") + 1];
_tcscpy(pNew,pBuf);
_tcscat(pNew,TEXT("Append"));
delete []pBuf;
pBuf = pNew;
呃,没错,的确如此,如果我们需要在一个数组末尾追加新值,这些麻烦的事情我们必须要亲身经历的。还好,我们现在终于可以和这种折磨人的玩意说Goodbye了。对于string而言,追加新值?很简单,就像JAVA一样:
strA += TEXT("Append");
是的,你没看错,就是一条语句,再无别处。
对于数组,对于容器,同样如此:
strB += szB;
strC += &vtC[0];
5.与API函数打交道
Windows平台的API函数,自然是要照顾C的使用者。所以,可以这么说:大部分的API函数,为了能够在C中调用,基本上采用的都是C接口的写法。而TSTRING,确切地说,是一个class,而不是一个value type,所以无法直接赋值。
以CreateFile为例,其声明如下:
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile
);
第一个参数是LPCTSTR,为一个指针,所以这样直接赋值铁定是通不过编译的:
CreateFile(strA, ...);
还好,伟大的STL构建者已经为我们考虑到了这个问题,我们只需要调用c_str函数即可:
CreateFile(strA.c_str(), ...);
类似,c_str还可以用在_tcslen,_tcscat等纯粹的字符串函数。