Windows编程中UNICODE和_UNICODE定义问题
来源:互联网 发布:c语言编程教材哪本书好 编辑:程序博客网 时间:2024/06/06 21:41
我初学Windows SDK编程时也碰到过这个问题,相信很多初学Windows编程的人也都碰到过,后来慢慢搞明白些了,但有时别人问到自己也说不太 清楚。今天借此机会,我也好好整理一下自已的思路,用下面这篇文章详细点地解释下这个问题,希望能帮助到有此疑问的朋友。
UNICODE和_UNICODE并不是在头文件中“定义”的,而是程序员通过以下方法之一定义的:
1、用代码定义的,就像你上面的一样;
2、编译选项中指定。比如在VC中是:
Project->Settings->C/C++->Category->Preprocessor->Preprocessor definitions
这里是预处理指令,还有一些其它常见的常量如:WIN32,_DEBUG,NDEBUG,_WINDOWS等。
所以你在头文件中找不到它的定义(注意是定义,不是使用,使用的地方则很多)。
但这两个符号对Windows程序却是有特定含义的,也就是说你不能将UNICODE定义为:Unicode,unicode,UseUnicode...否则毫无作用。因为在很多的头文件中,这两个符号用来判断:
1、用那一种编码方式,即Unicode和单字节;
2、一些Windows中特定的类型的含义;
3、根据即Unicode和单字节编码的不同而选择不同组的字符处理函数。
例如_UNICODE的例子你可以在TCHAR.H中找到,它用来解析TCHAR等类型是宽字符还是单字节字符,以及一些字符串宏的处理结果是宽字符还是单字节,比如:
#ifdef _UNICODE
typedef wchar_t TCHAR ;
#else
typedef char TCHAR ;
#endif
还有类似的方式定义的宏:
_TEXT ("Hello!") , _T ("Hello!") , TEXT ("Hello!") , L ("Hello!")
上面的宏全是一个意思:如果是UNICODE,则算是是宽字符;否则处理为传统单字节ASCII字符。
UNICODE在很多头文件中和_UNICODE一样用来解析TCHAR等类型是宽字符还是单字节字符,例如WINNT.H中:
#ifdef UNICODE
typedef WCHAR TCHAR, * PTCHAR ;
typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else
typedef char TCHAR, * PTCHAR ;
typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
同时用来选择字符处理函数,例如WINUSER.H中:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
这 样,我们只用一种类型(比如TCHAR)和一组函数(比如MessageBox)就方便地可以处理两种编码的程序,而不用去条件判断应该用char还是 wchar_t,应该用MessageBoxA还是MessageBoxW。这些细节Windows.h等头文件中已经为我们考虑了,我们要做的只是在需 要用Unicode时定义两个符号。
而另一方面,Windows.h经过辗转#include,又将WINNT.H、WINUSER.H 等很多头文件包含了进去,很多地方还有重复交叉的(当然用条件编译过滤过了),所以两个符号(UNICODE、_UNICODE)都要定义,否则像上面少 定义了一个的话,结果将很难预料。
UNICODE和_UNICODE并不是在头文件中“定义”的,而是程序员通过以下方法之一定义的:
1、用代码定义的,就像你上面的一样;
2、编译选项中指定。比如在VC中是:
Project->Settings->C/C++->Category->Preprocessor->Preprocessor definitions
这里是预处理指令,还有一些其它常见的常量如:WIN32,_DEBUG,NDEBUG,_WINDOWS等。
所以你在头文件中找不到它的定义(注意是定义,不是使用,使用的地方则很多)。
但这两个符号对Windows程序却是有特定含义的,也就是说你不能将UNICODE定义为:Unicode,unicode,UseUnicode...否则毫无作用。因为在很多的头文件中,这两个符号用来判断:
1、用那一种编码方式,即Unicode和单字节;
2、一些Windows中特定的类型的含义;
3、根据即Unicode和单字节编码的不同而选择不同组的字符处理函数。
例如_UNICODE的例子你可以在TCHAR.H中找到,它用来解析TCHAR等类型是宽字符还是单字节字符,以及一些字符串宏的处理结果是宽字符还是单字节,比如:
#ifdef _UNICODE
typedef wchar_t TCHAR ;
#else
typedef char TCHAR ;
#endif
还有类似的方式定义的宏:
_TEXT ("Hello!") , _T ("Hello!") , TEXT ("Hello!") , L ("Hello!")
上面的宏全是一个意思:如果是UNICODE,则算是是宽字符;否则处理为传统单字节ASCII字符。
UNICODE在很多头文件中和_UNICODE一样用来解析TCHAR等类型是宽字符还是单字节字符,例如WINNT.H中:
#ifdef UNICODE
typedef WCHAR TCHAR, * PTCHAR ;
typedef LPWSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCWSTR LPCTSTR ;
#else
typedef char TCHAR, * PTCHAR ;
typedef LPSTR LPTCH, PTCH, PTSTR, LPTSTR ;
typedef LPCSTR LPCTSTR ;
#endif
同时用来选择字符处理函数,例如WINUSER.H中:
#ifdef UNICODE
#define MessageBox MessageBoxW
#else
#define MessageBox MessageBoxA
#endif
这 样,我们只用一种类型(比如TCHAR)和一组函数(比如MessageBox)就方便地可以处理两种编码的程序,而不用去条件判断应该用char还是 wchar_t,应该用MessageBoxA还是MessageBoxW。这些细节Windows.h等头文件中已经为我们考虑了,我们要做的只是在需 要用Unicode时定义两个符号。
而另一方面,Windows.h经过辗转#include,又将WINNT.H、WINUSER.H 等很多头文件包含了进去,很多地方还有重复交叉的(当然用条件编译过滤过了),所以两个符号(UNICODE、_UNICODE)都要定义,否则像上面少 定义了一个的话,结果将很难预料。
总结:有了这些以就可以通过宏(也就是像:_T,LPTSTR,LPCTRSTR之类的带有T这个标志的)来再ASCII和UNICODE之间转换了。程序可移植性很强了。
0 0
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- Windows编程中UNICODE和_UNICODE定义问题
- 关于宽字符(_UNICODE||UNICODE)和windows套接(socket)字编程问题
- VC++ 6.0中关于UNICODE和_UNICODE的问题总结
- Windows编程,UNICODE,_UNICODE有什么区别
- UNICODE和_UNICODE
- Unicode和_UNICODE
- windows——UNICODE _UNICODE
- _UNICODE和UNICODE的区别
- UNICODE,_UNICODE
- UNICODE和_UNICODE的区别和联系
- VC++的Unicode编程(宏UNICODE与_UNICODE)
- VC++的Unicode编程(宏UNICODE与_UNICODE)
- VC++的Unicode编程(宏UNICODE与_UNICODE)
- UNICODE还是_UNICODE
- UNICODE 和_UNICODE 的区别,前者没有下划 线,专门用于Windows 头文件;后者有一个前缀下划线,专门用于C 运行时头文 件。
- java htmlunit使用说明
- HTML5基础加强css样式篇(animation填充属性:animation-fill-mode,播放控制属性:animation-play-state,播放顺序设置,)(三十一)
- Mysql-行列转换
- Android开发的基本布局模式
- C++实验3-项目1:个人所得税计算器
- Windows编程中UNICODE和_UNICODE定义问题
- 数字图像处理----深入理解高斯滤波器
- 关于For input String:"numbers" 的错误
- 杂记
- HTML中使背景图片自适应浏览器大小
- 【个人笔记重点,不作为参考】主题:docker常用命令
- cas 入门之四:认证管理器
- Troubleshooting Office Web Apps with SharePoint 2013
- 下载MODIS数据