TCHAR的引入,主要是在Tchar.h文件中,该文件包含这方面的重要的定义信息。
对于包含了对str函数或wcs函数进行显式调用的代码来说,无法非常容易地同时为肆让答ANSI和Unicode对这些代码进行编译。本章前面说过,可以创建同时为ANSI和Unicode进行编译的单个源代码文件。若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。
TChar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含应该用在源代码中的一组宏,而不应该直接调用str函数或者wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组宏。
TCHAR的定义如下:
#ifdef
UNICODE
typedef
wchar_t
TCHAR
#else
typedef
char
TCHAR
#endif
所以用MBCS来build时,TCHAR是char,使用UNICODE时,TCHAR是wchar_t。
还有一个宏来处理定义Unicode字符串常量时所需的L前缀。
#ifdef
UNICODE
#define
_T(x)
L##x
#define
_TEXT(x)
L##x
#define
__T(x)
L##x
#else
#define
_T(x)
x
#define
_TEXT(x)
x
#define
__T(x)
x
#endif
##
是一个预处理 *** 作符,它可以把两个参数连在一起。如果代码中需要字符串常量,在它前面加上_T宏。如果你使用Unicode来build,它会在字符串常量前加上L前缀。
TCHAR
szNewText[]
=
_T("we
love
Bob!")
_UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
像是用宏来隐藏SetWindowTextA/W的细节一样,还有很多可以使用的宏来实现str***()和_mbs***()等字符串函数。例如,可以使用_tcsrchr宏来替换strrchr()、_mbsrchr()和wcsrchr()。_tcsrchr根据预定义的宏是_MBCS还是UNICODE来扩展成正确的函数,就象SetWindowText所作的一样。
不仅str***()函数有TCHAR宏。其他的函数如,
_stprintf(代替sprinft()和swprintf()),_tfopen(代替fopen()和_wfopen())。
MSDN中"Generic-Text
Routine
Mappings."标题下有完整的宏列表。
Windows字符串函数
Windows还提供了一组范围很广的字符串 *** 作函数。这些函数与C运行期字符串函数(如strcpy和wcscpy)很相似。但是该 *** 作系统函数是 *** 作系统的一个组成部分, *** 作系统的许多组件都使用这些函数,而不使用C运行期库。建议最好使用 *** 作系统函数,而不要使用C运行期字符串函数。这将有助于稍稍提高应用程序的运行性能,因为 *** 作系统字符串函数常常被大型应用程序比如 *** 作系统的外壳进程Explorer.exe所使用。由于这些函数使用得很裂慧多,因此,在应用程序运行时,它们可能已经被装入RAM。
若要使用这些函数,系统必须运行Windows
2000或Windows
98。如果安装了Internet
Explorer
4.0或更新的版本,也可以在较早的Windows版本中获得这些函数。
在经典的 *** 作系统函数样式中, *** 作系统字符串函数名既包含大写字母,也包含小写字母,它的形式类似这个样子:StrCat、StrChr、StrCmp和StrCpy等。若要使用这些函数,必须加上ShlWApi.h头文件。另外,如前所述滑迹,这些字符串函数既有ANSI版本,也有Unicode版本,例如StrCatA
和StrCatW。由于这些函数属于 *** 作系统函数,因此,当创建应用程序时,如果定义了UNICODE(不带前置下划线),那么它们的符号将扩展为宽字符版本。
Windows也提供了一组用于对Unicode字符串进行 *** 作的函数,表2
-
4对它们进行了描述。
表2-4
对Unicode字符串进行 *** 作的函数
函数描述
lstrcat
将一个字符串置于另一个字符串的结尾处
lstrcmp
对两个字符串进行区分大小写的比较
lstrcmpi
对两个字符串进行不区分大小写的比较
lstrcpy
将一个字符串拷贝到内存中的另一个位置
lstrlen
返回字符串的长度(按字符数来计量)
这些函数是作为宏来实现的,这些宏既可以调用函数的Unicode版本,也可以调用函数的ANSI版本,这要根据编译源代码模块时是否已经定义了UNICODE而定。例如,如果没有定义UNICODE,lstrcat函数将扩展为lstrcatA。如果定义了UNICODE,lstrcat将扩展为lstrcatW。
在windows环境下 *** 作DBCS:
如果只是调用strlen函数,那么无法真正了解字符串中究竟有多少字符,它只能知道到达结尾的0之前有多少个字节。ANSI的C运行期库中没有配备相应的函数,能够对双字节字符集进行 *** 作。但是,Microsoft
Visual
C++的运行期库却包含许多函数,如_mbslen
,它可以用来 *** 作多字节(既包括单字节也包括双字节)字符串。
为了帮助对DBCS字符串进行 *** 作,Windows提供了下面的一组帮助函数(见表2
-
1
)。前两个函数CharNext
和CharPrev
允许前向或逆向遍历DBCS字符串,方法是每次一个字符。第三个函数IsDBCSLeadByte,
在字节返回到一个两字字节符的第一个字节时将返回TRUE。
表2-1
对DBCS字符串进行 *** 作的帮助函数
PTSTR
CharNext(PCTSTR
pszCurrentChar)
返回字符串中的下一个字符的地址
PTSTR
CharPrev(PCTSTR
pszStart,PCTSTR
pszCurrentChar
);
返回字符串中的上一个字符的地址
BOOL
IsDBCSLeadByteTRUE(BYTE
bTestChar);
如果该字节是DBCS字符的第一个字节,则返回
你羡渣胡兄拦可梁碰以使用sprintf(_stprintf)e.e:
char* szTmp[8] = {0}
sprintf(buf,"%f",float变量)
你申改正明了一个TCHAR型的指针,却未给你碧态分配内存空间,这样的访核慧悔问自然是不允许的。。。所以,你应该把TCHAR* tmp改成TCHAR* tmp=new TCHAR[30]
这样就可以了,你自己试一下,不懂的话,可以继续追问~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)