关于char, wchar_t, TCHAR, _T,L,TEXT,_TEXT,LPSTR,LPCSTR,PWSTR,PCWSTR,LPTSTR,LPCTSTR的区别

来源:互联网 发布:注册淘宝网店铺流程 编辑:程序博客网 时间:2024/05/16 10:43
#ifdef   UNICODE               typedef   wchar_t   TCHAR;    #else               typedef   unsigned   char   TCHAR;    #endif typedef   unsigned   char   CHAR;     typedef   unsigned   wchar_t   WCHAR;  

char :

单字节变量类型,最多表示 256 个字符。char==CHAR

wchar_t :

宽字节变量类型,用于表示 Unicode 字符, 它实际定义在里:typedef unsigned short wchar_t。 为了让编译器识别 Unicode 字符串,必须以在前面加一个“L”,定义宽字节类型方法如下: wchar_t c = `A’ ; wchar_t * p = L”Hello!” ; wchar_t a[] = L”Hello!” ; 其中,宽字节类型每个变量占用 2 个字节,故上述数组 a 的 sizeof(a) = 14 。wchar_t==WCHAR

TCHAR / _T :

在C语言里面提供了 _UNICODE宏(有下划线),在Windows里面提供了UNICODE宏(无下划线),只要定了_UNICODE宏和UNICODE宏,系统就会自动切换到UNICODE版本,否则,系统按照ANSI的方式进行编译和运行。只定义了宏并不能实现自动的转换,他还需要一系列的字符定义支持。,如果在程序中既包括 ANSI 又包括 Unicode 编码, 需要包括头文件 tchar.h。 TCHAR 是定义在该头文件中的 宏,如果定义了UNICODE宏则TCHAR被定义为wchar_t,否则TCHAR被定义为char。
定义了UNICODE宏: typedef wchar_t TCHAR;
未定义UNICODE宏: typedef char TCHAR;

_T :

_T 是一个适配的宏~ 当定义了 _UNICODE 的时候 _T 就是 L,如果项目使用了Unicode字符集(定义了UNICODE宏),则自动在字符串前面加上L【这时 _T(“ABCD”) 相当于 L”ABCD” ,这是宽字符串】,否则字符串不变【_T宏不会在字符串前面加那个L,_T(“ABCD”) 就等价于 “ABCD” 】。因此,Visual C++里边定义字符串的时候,用_T来保证兼容性。_T宏可以把一个引号引起来的字符串,根据你的环境设置,使得编译器会根据编译目标环境选择合适的(Unicode还是ANSI)字符处理方式。
注意:如果在程序中使用了 TCHAR,那么就不应该使用 ANSI 的 strXXX 函数或者 Unicode 的 wcsXXX 函 数了,而必须使用 tchar.h 中定义的_tcsXXX 函数。 以 strcpy 函数为例子,总结一下:

//如果你想使用 ANSI 字符串,那么请使用这一套写法:       char szString[100];strcpy(szString,"test"); //如果你想使用 Unicode 字符串,那么请使用这一套://C运行库中的Unicode函数:以wcs开头 wchar_t szString[100]; wcscpy(szString,L"test"); //如果你想通过定义_UNICODE 宏,而编译 ANSI 或者 Unicode 字符串代码: TCHAR szString[100]; _tcscpy(szString,_TEXT("test")); 

CSDN:superarhow 说: 不要再使用 TCHAR 和_T 了! 他分析了原因后总结: 果您正开始一个新的项目, 如 请无论如何也要顶住压力,直接使用 UNICODE 编码!切记!您只需要对您的组员进行 10 分钟的培训, 记住 strcpy 用 wcscpy,sprintf 用 swprintf 代替,常数前加 L,就可以了!它不会花您很多时间的,带给您 的是稳定和安全!相信偶,没错的! !

L :

作用: 如 L”我的字符串” 表示将 ANSI 字符串转换成 unicode 的字符串,就是每个字符占用两个字节。 strlen(“asd”) = 3; strlen(L”asd”) = 6;

TEXT,_TEXT :

和_T 一样的 如下面三语句:

1.TCHAR szStr1[] = TEXT("str1"); 2.char szStr2[] = "str2"; 3.WCHAR szStr3[] = L("str3"); 

第1句在定义了 UNICODE 时会解释为第3句,没有定义时就等于第2句。 但2句话无论是否定义了 UNICODE 都是生成一个 ANSI 字符串,而第3句话总是生成 UNICODE 字符串。 为了程序的可移植性,建议都用第一种表示方法。 但在某些情况下,某个字符必须为 ANSI 或 UNICODE,那就用后两种方法。

_T():

函数详解 _T(“”)是一个宏,他的作用是让你的程序支持 Unicode 编码 因为 Windows 使用两种字符集 ANSI 和 UNICODE, 前者就是通常使用的单字节方式, 但这种方式处理象中文这样的双字节字符不方便, 容易出现半个汉字的情况。 而后者是双字节方式,方便处理双字节字符。 Windows NT 的所有与字符有关的函数都提供两种方式的版本,而 Windows 9x 只支持 ANSI 方式。 如果你编译一个程序为 ANSI 方式, _T 实际不起任何作用。 而如果编译一个程序为 UNICODE 方式,则编译器会把”Hello”字符串以 UNICODE 方式保存。_T 和_L 的 区别在于,_L 不管你是以什么方式编译,一律以 UNICODE 方式保存。

LPSTR:

32-bit LPSTR 是一个指向以‘\0’结尾的 ANSI 字符数组的指针,每个字符占 1 字节 ,与 char*可以 互换使用,在 win32 中较多地使用 LPSTR。LPSTR = char ,(typedef char LPSTR)

LPCSTR:

32-bit 指针指向一个指向以NULL(‘\0’)结尾的ANSI常量字符串,每个字符占 1 字节 ,LPCSTR 中增加的‘C’的含义是“CONSTANT” (常量) ,表明这种数据类型的实例不能被使用它的 API 函数改变,除此之外,它与 LPSTR 是等同的。

PWSTR:

指向Unicode字符串的指针,每个字符占 2 字节。

PCWSTR:

指向一个恒定的Unicode字符串的指针,每个字符占 2 字节。

LPTSTR:

32-bit 指针每字符可能占 1 字节或 2 字节,取决于 Unicode 是否定义 L 是表示字符串资源为 Unicode 的。

LPCTSTR:

32-bit 指针指向一个常量字符串,每字符可能占 1 字节或 2 字节,取决于 Unicode 是否定义。如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串

T 是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()……) ,它表示使用一种中间类 型,既不明确表示使用 MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定。

参考了博客http://www.cnblogs.com/yaowen/archive/2013/01/15/2861727.html

阅读全文
0 0
原创粉丝点击