char,wchar_t,CHAR,WCHAR,TCHAR,PSTR,PCSTR,PCTSTR,_T,_TEXT,L

首先,这是一个字符集的问题。在ANSI字符集中,字符类型是char,在UNICODE字符集中,字符类型是wchar_t,也可以称之为宽字符,宽字符占两个字节。

然后,我们来看一段定义代码:

//winnt.h

typedef char  CHAR;  //8位

typedef wchar_t  WCHAR;  //16位

typedef CHAR  *PCHAR;

typedef CHAR  *PSTR;

typedef CONST CHAR   *PCSTR;

typedef WCHAR  *PWCHAR;

typedef WCHAR  *PWSTR;

typedef CONST WCHAR   *PCWSTR;

//重点在这边

#ifdef  UNICODE  //如果使用的事UNICODE字符集,一般来说,VS建立的工程默认都是使用UNICODE字符集

  typedef WCHAR  TCHAR,*PTCHAR,*PTSTR;

  typedef CONST WCHAR   *PCTSTR;

  #define _TEXT(quote)  L##quote

  #define _T(quote)  L##quote

#else

  typedef CHAR  TCHAR,*PTCHAR,*PTSTR;

  typedef   CONST CHAR   *PCTSTR;

  #define  _TEXT(quote)  quote

  #define   _T(quote)   quote

#endif

#define TEXT(quote)  _TEXT(quote)

//下面这句话才是最重要的要记住的!!!

由此可以看出,“C”是指CONST,“T”表示如果使用UNICODE字符集的话就代表是“W”,即宽字符类型,PSTR是指向字符的指针类型,即char*

所以,如果使用UNICODE字符集的话,可以这样理解:

    TCHAR ——> WCHAR

    PCTSTR ——> PCWSTR ——> CONST PWSTR ——> CONST "wide" PSTR ——>const "wide" char* ——>const wchar_t*,同理,PTSTR可以理解成wchar_t*

所以平常用的时候要尽量使用TCHAR,PTSTR,PCTSTR

还有一个“L”,加一个“L”表明通知编译器应该把该字符串编译为一个UNICODE字符串,即字符串里的每个字符使用两个字节来表示,如LPSTR,LPCSTR指向的字符串里的字符都是占两个字节,但是L和T都出现的时候可以去掉其中一个,比如LPTSTR和LPCTSTR,去掉里面的L,就相当于PTSTR和PCTSTR,和原来没什么区别。

因为大家都习惯了C语言里的库函数,所以在Windows编程里会常常习惯性的用到,尤其是字符串处理函数,但是编译的时候又会发现错误,又或者编译通过而不能运行。其实原因也很简单,C语言的字符串函数支持的是ANSI字符集,所以我们在Windows编程里不能使用string.h里的字符串函数。建议使用的是头文件tchar.h里面的字符串处理函数,具体处理函数请看下一篇文章。

另外,Windows编程里在调用系统接口通常都有两种,如SetWindowText有SetWindowTextA和SetWindowTextW两种,一个支持ANSI字符集,一个支持UNICODE字符集。事实上,ANSI版本的函数的内部只分配内存,然后执行字符串转换,再调用该函数的UNICODE版本。不过平常我们只要用SetWindowText就行了,它的形式和上面的宏定义差不多,如果使用UNICODE字符集则内部用UNICODE版本的函数。

《Windows核心编程》这本书中对于Windows中的字符和字符串处理方式推荐:

   1.将字符串当作字符数组看待

   2.使用通用数据类型,如TCHAR,PTSTR等

   3.避免使用prinf系列函数

   4.使用安全的字符串处理函数

   5.用tchar.h中的字符串处理函数

   6.修改与字符串相关的计算,字符串所占的字符数和字节数不一定相同

时间: 2024-08-25 19:58:09

char,wchar_t,CHAR,WCHAR,TCHAR,PSTR,PCSTR,PCTSTR,_T,_TEXT,L的相关文章

char,wchar_t,WCHAR,TCHAR,ACHAR的区别----LPCTSTR

转自http://blog.chinaunix.net/uid-7608308-id-2048125.html 简介:这是DWORD及LPCTSTR类型的了解的详细页面,介绍了和类,有关的知识,加入收藏请按键盘ctrl+D,谢谢大家的观看!要查看更多有关信息,请点击此处 首先声明,这都是在网上找的资料,我再整理修改的: 一:关于DWORD DWORD就是32bit的unsigned  long无符号长整型,DWORD是双字类型 ,4个字节,API函数中有很多参数和返回值是DWORD的. 二:如何

从char/wchar_t到TCHAR .

原文:http://blog.csdn.net/phunxm/article/details/5082618 一.ANSI和UNICODE 1.为什么要使用UNICODE?  (1) 可以很容易地在不同语言之间进行数据交换. (2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件. (3) 提高应用程序的运行效率. Windows 2000是使用UNICODE从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成UNICODE,

C++字符类型总结区别wchar_t,char,WCHAR

转至:http://www.360doc.com/content/12/0807/01/9290626_228750141.shtml 1.区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数.   UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里:   typedef unsigned short wchar_t;   另外,在头文件中有这样的定义:ty

区别wchar_t,char,WCHAR

1.区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数. UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里: typedef unsigned short wchar_t; 另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t wchar_t 可用字符串处理函数:wcscat(),wcscpy(

c++ 字符类型总结区别wchar_t,char,WCHAR(转)

1.区别wchar_t,char,WCHAR ANSI:即 char,可用字符串处理函数:strcat( ),strcpy( ), strlen( )等以str打头的函数.   UNICODE:wchar_t是Unicode字符的数据类型,它实际定义在里:   typedef unsigned short wchar_t;   另外,在头文件中有这样的定义:typedef wchar_t WCHAR; 所以WCHAR实际就是wchar_t   wchar_t 可用字符串处理函数:wcscat()

c++中char*\wchar_t*\string\wstring之间的相互转换

最近在编程中经常遇到需要多字节字符与宽字节字符相互转换的问题,一直自己贴那几句代码.觉得麻烦,于是就自己写了一个类来封装wchar_t与char类型间的转换, 其他的,诸如:CString\ LPWSTR\TCHAR   CHAR\LPSTR之间也是一样用 头文件: #ifndef USE_H_ #define USE_H_ #include <iostream> #include <windows.h> #include <string> using namespac

C语言中char* 和 char []区别

想要把丢掉的东西捡起来,还是很辛苦啊,今天我就发现,我连char* 和 char []的区别都不知道. 很多人觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正. 本质上来说,char *s定义了一个char型的指针,它只知道所指向的内存单元,并不知道这个内存单元有多大,所以:当char *s = "hello";后,不能使用s[0]='a':语句进行赋值.这是将提示内存不能为"written".当用char s[]="hel

char *与char []深度刨析

编译不能通过 #include "iostream" using namespace std; int _tmain(int argc, _TCHAR* argv[]) { char *p= "hello" ; //不是把一个字符串赋给了一个字符型的指针,而是把一个字符型的指针指向了字符串的首地址. strcpy(p,"hel"); cout << p << endl; return 0; }//编译通不过 解析:char

string char * const char *之间的互相转换

string  ->   const char * 用str的c_str()方法或者data()方法均可,这个两个方法返回值为cong char * string str = "hello"; const char *a = str.c_str(); const char *b = str.c_str(); const char *  ->  string const char*转换为 string,直接赋值即可 string  ->  char * vs不让用str