• 4.5.3 TCHAR、_T与_TEXT


    计算机最初使用的不是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, PTSTRLPTSTR ;   
    4.     typedef LPCWSTR LPCTSTR ;        
    5. #else  
    6.     typedef char TCHAR, * PTCHAR ;    
    7.     typedef LPSTR LPTCH, PTCH, PTSTRLPTSTR ;   
    8.     typedef LPCSTR LPCTSTR ;     
    9. #endif 

    ===========================================

    以上摘自《把脉VC++》第4.5.3 小节的内容 ,如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533

  • 相关阅读:
    hdu 2647 Reward
    hdu 2094 产生冠军
    hdu 3342 Legal or Not
    hdu 1285 确定比赛名次
    hdu 3006 The Number of set
    hdu 1429 胜利大逃亡(续)
    UVA 146 ID Codes
    UVA 131 The Psychic Poker Player
    洛谷 P2491消防 解题报告
    洛谷 P2587 [ZJOI2008]泡泡堂 解题报告
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116069.html
Copyright © 2020-2023  润新知