UNICODE 和_UNICODE 的区别,前者没有下划 线,专门用于Windows 头文件;后者有一个前缀下划线,专门用于C 运行时头文 件。

如 下 是 tchar.h 头文件中部分代码摘抄:
#ifdef _UNICODE
typedef wchar_t TCHAR;
#define __T(x) L##x
#define _T(x) __T(x)
#else
#define __T(x) x
typedef char TCHAR;
#endif
可 见, 这些宏根据”_UNICODE” 定义与否, 分别展开为ANSI 或Unicode 字
符。 tchar.h 头文件中定义的宏可以分为两类:
A、实现字符和常量字符串定义的宏我 们只列出两个最常用的宏:

未 定 义
_UNICODE(ANSI
字符)
定义了
_UNICODE(Unicode
字符)
TCHAR char wchar_t
_T(x) x L##x
注意:
“##”是ANSI C 标准的预处理语法,它叫做“粘贴符号”,表示将前面的L 添加到
宏参数上。也就是说,如果我们写_T(“Hello”),展开后即为L“Hello”
B、实现字符串函数调用的宏
C++为字符串函数也定义了一系列宏,同样,我们只例举几个常用的宏:

未 定 义
_UNICODE(ANSI
字符)
定义了
_UNICODE(Unicode
字符)
_tcschr strchr wcschr
_tcscmp strcmp wcscmp
_tcslen strlen wcslen
四、使用Win32 API 进行Unicode 编程
Win32 API 中定义了一些自己的字符数据类型。这些数据类型的定义在winnt.h 头
文件中。例如:
typedef char CHAR;
typedef unsigned short WCHAR; // wc, 16-bit UNICODE
character
typedef CONST CHAR *LPCSTR, *PCSTR;
Win32 API 在winnt.h 头文件中定义了一些实现字符和常量字符串的宏进行
ANSI/Unicode 通用编程。同样, 只例举几个最常用的:
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR;
typedef LPWSTR LPTCH, PTCH;
typedef LPWSTR PTSTR, LPTSTR;
typedef LPCWSTR LPCTSTR;
#define __TEXT(quote) L##quote // r_winnt
#else /* UNICODE */ // r_winnt
typedef char TCHAR, *PTCHAR;
typedef LPSTR LPTCH, PTCH;
typedef LPSTR PTSTR, LPTSTR;
typedef LPCSTR LPCTSTR;
#define __TEXT(quote) quote // r_winnt
#endif /* UNICODE */ // r_winnt
从以上头文件可以看出, winnt.h 根据是否定义了UNICODE( 没有下划线),
进行条件编译。
Win32 API 也定义了一套字符串函数, 它们根据是否定义了“UNICODE”分别
展开为ANSI 和Unicode 字符串函数。如:lstrlen。API 的字符串操作函数和C++
的操作函数可以实现相同的功能, 所以, 如果需要的话, 建议您尽可能使用C++
的字符串函数, 没必要去花太多精力再去学习API 的这些东西。
也许您从来没有注意到,Win32 API 实际上有两个版本。一个版本接受MBCS
字符串,另一个接受Unicode 字符串。例如:其实根本没有SetWindowText()这个
API 函数, 相反, 有SetWindowTextA()和SetWindowTextW()。后缀A 表明这是
MBCS 函数, 后缀W 表示这是Unicode 版本的函数。这些API 函数的头文件在
winuser.h 中声明, 下面例举winuser.h 中的SetWindowText()函数的声明部分:
#ifdef UNICODE
#define SetWindowText SetWindowTextW
#else
#define SetWindowText SetWindowTextA
#endif // !UNICODE
可 见, API 函数根据定义UNICODE 与否决定指向Unicode 版本还是MBCS
版本。
细心的读者可能已经注意到了UNICODE 和_UNICODE 的区别,前者没有下划
线,专门用于Windows 头文件;后者有一个前缀下划线,专门用于C 运行时头文
件。换句话说, 也就是在ANSI C++语言里面根据_UNICODE( 有下划线) 定义与
否,各宏分别展开为Unicode 或ANSI 字符,在Windows 里面根据UNICODE( 无
下划线) 定义与否, 各宏分别展开为Unicode 或ANSI 字符。
在后面我们将会看到, 实际使用中我们不加严格区分, 同时定义_UNICODE
和UNICODE, 以实现UNICODE 版本编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值