注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

信息 灵感 创新

I? =Information,Inspiration,Innovation

 
 
 

日志

 
 
关于我

we are 5. Mathematics, Computation, Programming, Engineering, and Making fun of life.

网易考拉推荐

L,_T、__T及_TEXT等宏  

2014-06-12 15:25:31|  分类: Windows编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

许多人在编写C++程序的时候,尤其是针对Windows应用程序时,总能碰到一些比较稀奇古怪的格式,例如:

MessageBox(NULL,_T("Hello, World!"),_T("INFO"),MB_ICONINFORMATION);

显然这个简单的程序只是一个消息框,但是为什么其中会有_T这种情况呢?有时候不加这个程序也能运行的很好啊?它到底有什么作用呢?

这个问题归根结底是ASCII码和Unicode码之间的问题。众所周知,ASCII用1个字节表示0-9和26个大小写字母,以及其他一些标点符号、控制字符等,但是这只能表示英语等极少数语言,为了表达更多的字符,就采用了两个字节的Unicode码,但是这会带来一些问题。

首先,我们在定义宽字符的时候,采用如下的语句会带来编译警告甚至是错误:

wchar_t* msg="Hello, world!";

无法从“const char [14]”转换为“wchar_t *” ,为了定义宽字符,需要在前面加上大写字母L,如下:

wchar_t* msg=L"Hello, world!";
但是在处理这些宽字符的时候,如果没有定义宏UNICODE,strlen只是简单地将字符串中’\0’之前的字节个数计算出来,时候调用strlen等函数只会返回1,因此,为了解决这种问题,就提供了wstrlen等函数,就是宽字符集的版本。
再说说L这个宏,它告诉编译器子Unicode环境下将字符处理为宽字符,那么_T和__T(有两个下划线)还有TEXT()等是怎么回事呢?
其实他们的作用都是和L一样的,只是用法有点差别而已,在tchar.h头文件中,可以看到:
#define __T(x)      L ## x

这里的##表示粘贴符号,表示将L放入宏参数前,因此,__T(“Hello”)等效于L”Hello”,此外,还有两个定义:

#define _T(x)       __T(x)
#define _TEXT(x)    __T(x)

因此,它们只是__T的别名,而没有其他更多的功能,使用起来看个人习惯了。

最后,在WinNT.h中,将_TEXT定义为了TEXT和__TEXT,如果定义了UNICODE宏,则字符占2个字节,否则是一个字节。

  评论这张
 
阅读(443)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016