计算机最初使用的不是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
TCHAR、_T与_TEXT
最新推荐文章于 2023-04-04 16:34:09 发布