zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Flex 学习笔记------组件和视图
    Flex 学习笔记------基于LZMA的文件压缩与上传
    Flex 学习笔记------FLACC & Crossbridge
    Flex 学习笔记------全局事件
    Flex 学习笔记------对象的深层拷贝
    Flex 学习笔记------as 与 js 的通信
    Flex 学习笔记------Local Shared Object 和 Custom Class
    Flex 学习笔记------读取Jpeg图片的width,height和colorSpace
    翻译:eval() 不是魔鬼,只是易被误解
    翻译:javascript 内存管理
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116070.html
Copyright © 2011-2022 走看看