大家一起做一个项目,经常发现有的人爱用strcpy等标准ANSI函数,有的人爱用_tXXXX函数,这个问题曾经搞的很混乱。为了统一,有必要把来龙去脉搞清楚。
 为了搞清这些函数,就必须理请几种字符类型的写法。char就不用说了,先说一些wchar_twchar_tUnicode字符的数据类型,它实际定义在<string.h>里:
 typedef unsigned short wchar_t;
不能使用类似 strcpy这样的ANSI C字符串函数来处理wchar_t字符串,必须使用wcs前缀的函数,例如wcscpy。为了让编译器识别Unicode字符串,必须以在前面加一个 “L”,例如:
 wchar_t *szTest=L"This is a Unicode string.";
 下面在看看TCHAR。如果你希望同时为ANSIUnicode编译的源代码,那就要include TChar.hTCHAR是定义在其中的一个宏,它视你是否定义了_UNICODE宏而定义成char或者wchar_t。如果你使用了TCHAR,那么就不应该使用ANSIstrXXX函数或者UnicodewcsXXX函数了,而必须使用TChar.h中定义的_tcsXXX函数。另外,为了解决刚才提到带“L”的问题,TChar.h中定义了一个宏:“_TEXT”
 strcpy函数为例子,总结一下:
 .如果你想使用ANSI字符串,那么请使用这一套写法:
 char szString[100];
 strcpy(szString,"test");
 .如果你想使用Unicode字符串,那么请使用这一套:
 wchar_t szString[100];
 wcscpyszString,L"test");
 .如果你想通过定义_UNICODE宏,而编译ANSI或者Unicode字符串代码:
 TCHAR szString[100];
 _tcscpy(szString,_TEXT("test"));
2.字符串及处理之三: 使用TCHAR系列方案
使用TCHAR系列方案编写程序
  TCHAR是一种字符串类型,它让你在以MBCSUNNICODEbuild程序时可以使用同样的代码,不需要使用繁琐的宏定义来包含你的代码。 
      TCHAR的引入,主要是在Tchar.h文件中,该文件包含这方面的重要的定义信息。
      对于包含了对str函数或wcs函数进行显式调用的代码来说,无法非常容易地同时为ANSI
Unicode对这些代码进行编译。本章前面说过,可以创建同时为ANSIUnicode进行编译的单个源代码文件。若要建立双重功能,必须包含TChar.h文件,而不是包含String.h文件。
      TChar.h文件的唯一作用是帮助创建ANSI/Unicode通用源代码文件。它包含你应该用在源代码中的一组宏,而不应该直接调用str函数或者 wcs函数。如果在编译源代码文件时定义了_UNICODE,这些宏就会引用wcs这组函数。如果没有定义_UNICODE,那么这些宏将引用str这组宏。
      TCHAR的定义如下:
      #ifdef UNICODE
      typedef wchar_t TCHAR;
      #else
      typedef char TCHAR;
      #endif
      所以用MBCSbuild时,TCHARchar,使用UNICODE时,TCHARwchar_t
      还有一个宏来处理定义Unicode字符串常量时所需的L前缀。
      #ifdef UNICODE
      #define _T(x) L##x
      #define _TEXT(x) L##x
      #define __T(x) L##x
字符串拷贝函数strcpy作用      #else
      #define _T(x) x
      #define _TEXT(x) x
      #define __T(x) x
      #endif
    ## 是一个预处理操作符,它可以把两个参数连在一起。如果你的代码中需要字符串常量,在它前面加上_T宏。如果你使用Unicodebuild,它会在字符串常量前加上L前缀。
      TCHAR szNewText[] = _T("we love Bob!");
    _UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。
  像是用宏来隐藏SetWindowTextA/W的细节一样,还有很多可以供你使用的宏来实现str***()_mbs***()等字符串函数。例如,你可以使用_tcsrchr宏来替换strrchr()_mbsrchr()wcsr
chr()_tcsrchr根据你预定义的宏是_MBCS还是 UNICODE来扩展成正确的函数,就象SetWindowText所作的一样。
   不仅str***()函数有TCHAR宏。其他的函数如, _stprintf(代替sprinft()swprintf(),_tfopen(代替fopen()_wfopen())。 MSDN"Generic-Text Routine Mappings."标题下有完整的宏列表。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。