TCHAR、_T与_TEXT

本文探讨了在Visual C++中如何通过宏定义选择Unicode或ANSI编码,并介绍了TCHAR宏及其相关类型定义,帮助开发者更好地处理字符集问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机最初使用的不是UNICODE,最初的系统和程序都采用的是ANSI或者MBCS,那么,问题来了:我们开发程序的时候,是采用char还是wchar_t?观察如下代码:

   1. char msg[] = "学习C++";

当我们准备采用wchar_t时,则需要改成:

   1. wchar_t msg[] = L"学习C++";

太麻烦了!幸运的是,Visual C++的开发者预知到了这样的麻烦,他们从而为此造出了一批宏,这些宏看起来乱七八糟的,但是确实解决了我们的问题,且看一段代码:

   1. TCHAR msg[] = _T("学习C++");

这段代码中,msg到底是char数组还是wchar_t数组呢?Visual C++的解释是,如果需要它是char数组,那么它就是char数组;否则,它就是wchar_t数组。这样的魅力来源于宏TCHAR的定义:

   1. typedef   unsigned   char   CHAR; 
   2. typedef   unsigned   wchar_t   WCHAR;  
   3. 
   4. #ifdef   UNICODE 
   5.     typedef   wchar_t   TCHAR;  
   6. #else 
   7.     typedef   unsigned   char   TCHAR; 
   8. #endif

由此可以看出,CHAR实际上就是unsigned char,WCHAR为wchar_t,而TCHAR根据是否支持UNICODE而不同。宏UNICODE由此变得尤其重要,当我们定义了UNICODE 宏,就相当于告诉了编译器:我准备采用UNICODE版本。这个时候,TCHAR就会摇身一变,由unsigned char变成了wchar_t。

Visual C++项目属性中都包含一项字符集的设置,如图4-14所示。很容易理解,它与宏UNICODE之间存在着某种关系(还有宏MCBS,为了简化讨论,在此省略)。

 
(点击查看大图)图4-14  在Visual C++中设置项目采用的字符集

前面分析了TCHAR,接下来再来看看_T的含义:

   1. #define _T(x)       __T(x) 
   2. #define _TEXT(x)    __T(x) 
   3. 
   4. #ifdef   UNICODE 
   5.     #define __T(x)      L ## x 
   6. #else 
   7.     #define __T(x)      x 
   8. #endif

同理,当UNICODE宏被定义,"_T("学习C++")"会解释成"L"学习C++"",否则它只将其解释成""学习C++""。

因此,我们建议这样书写代码:

   1. TCHAR msg[] = _T("学习C++");

除TCHAR之外,Windows还定义了一系列的包含T的宏:

   1. #ifdef  UNICODE  
   2.     typedef WCHAR TCHAR, * PTCHAR ; 
   3.     typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;  
   4.     typedef LPCWSTR LPCTSTR ;       
   5. #else 
   6.     typedef char TCHAR, * PTCHAR ;   
   7.     typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;  
   8.     typedef LPCSTR LPCTSTR ;    
   9. #endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值