Windows 小知识点汇总

_T()

1、定义

_T("")是一个宏,定义于tchar.h下。

#define   __T(x)  L ## x

#define   _T(x)  __T(x)

2、作用

它的作用是让你的程序支持Unicode编码,因为Windows使用两种字符集ANSI和UNICODE,前者就是通常使用的单字节方式,但这种方式处理像中文这样的双字节字符不方便,容易出现半个汉字的情况。而后者是双字节方式,方便处理双字节字符。

Windows NT的所有与字符有关的函数都提供两种方式的版本,而Windows 9x只支持ANSI方式。

如果你编译一个程序为ANSI方式,_T实际不起任何作用。而如果编译一个程序为UNICODE方式,则编译器会把"Hello"字符串以UNICODE方式保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以UNICODE方式保存。

LPSTR:32bit指针指向一个字符串,每个字符占1字节。

LPCSTR:32-bit指针指向一个常字符串,每个字符占1字节。

LPCTSTR:32-bit指针指向一个常字符串,每字符可能占1字节或2字节,取决于Unicode是否定义

LPTSTR:32-bit指针每字符可能占1字节或2字节,取决于Unicode是否定义。

L是表示字符串资源为Unicode的。

比如Wchar  _tStr[] =L"Hello World!",这个就是双字节存储字符了。

_T是一个适配的宏~

#ifdef _UNICODE的时候

_T就是L

没有#ifdef _UNICODE的时候

_T就是ANSI的。

比如

LPTSTR  lpStr = new TCHAR[32];

TCHAR*  szBuf = _T("Hello");

以上两句使得无论是在UNICODE编译条件下还是在ANSI编译条件下都是正确编译的。

而且MS推荐你使用相匹配的字符串函数。

比如处理LPTSTR或者LPTCSTR的时候,不要用strlen ,而是要用_tcslen

否则在UNICODE的编译条件下,strlen不能处理wchar _t*的字符串。

T是非常有意思的一个符号(TCHAR、LPCTSTR、LPTSTR、_T()、_TEXT()...),它表示使用一种中间类型,既不明确表示使用
MBCS,也不明确表示使用 UNICODE。那到底使用哪种字符集?编译的时候才决定。

时间: 2024-10-27 02:39:13

Windows 小知识点汇总的相关文章

年度巨献-WPF项目开发过程中WPF小知识点汇总(原创+摘抄)

WPF中Style的使用 Styel在英文中解释为”样式“,在Web开发中,css为层叠样式表,自从.net3.0推出WPF以来,WPF也有样式一说,通过设置样式,使其WPF控件外观更加美化同时减少了大量的复杂属性的设置. 在WPF中,设置外观样式我们有很多种方式,比如通过设置控件的属性来控制控件的外观样式:或者通过在每一个控件中分别设置Style:或者通过在整个Window.Resource中设置Style,又或者在App.xaml的Application.Resource设置Style. 在

python基础(十二)--小知识点汇总及编码进阶

'''python2 python3 '''#python2#print()  print 'abc'#range()   xrange() 生成器# raw_input() #python3#print('abc')#range()# input() # = 赋值 == 比较值是否相等   is 比较,比较的是内存地址  id(内容)# li1 = [1,2,3]# li2 = li1# li3 = li2# print(id(li1),id(li2)) #数字,字符串 小数据池#数字的范围

我所遇到的shell小知识点汇总

1)shell if 的使用 判断a.txt是否存在 if [ -f a.txt] 2)命令的执行结果 将命令的执行结果赋值给变量,以下两种方法是一样的 time=$(date + %Y%m) time=`date + $Y%m` 3)查找出我们需要的东西 这个可以用来判断命令的执行结果,通过所选取的文件或命令执行结果中是否有相应的值 -o表示匹配的就只是我们关心的部分,加-P表明后面的pattern是perl兼容正则表达式,因为pcre支持零宽断言 [[email protected] by-

Linux 一些小知识点汇总(持续更新....)

一.符号 1.[email protected]:传递的参数. 2.$# :传递参数的数量. 3.$?:指上一次执行命令后的返回值.一般0表示运行成功. 补充:$?只表示上一个命令执行后的退出状态,当命令执行后,又执行了其他命令,然后查看$?状态时,只表示第二个执行命令的状态,与第一个无关. 4.$! :后台运行的最后一个进程的进程号(PID). 5.$$:当前进程的进程号(PID). 6.!!:再次执行上一次运行的命令,并在屏幕上打印出所执行的命令. 7.!*:替代上一次运行的命令,参数继续沿

Linux小知识点汇总

? ? 1.crontab? ? (1)crontab每10秒执行一次? * * * * * /bin/date >>/tmp/date.txt? * * * * * sleep 10; /bin/date >>/tmp/date.txt? (2)还可以用以下方式表达? string????????????meaning??------???????????-------??@reboot????????Run?once,?at?startup.??@yearly?????????

【我的笔记BLOG——小知识点汇总】

1.<%  %> ,  <%-  %> ,  <%= %>的区别 ejs的标签分为三种: (1)<% code %>   javascript代码 (2) <%- code  %>  显示结果会按HTML语法转换格式 (3)<%= code  %>  显示原样结果 例: 若code为<h1> hello </h1> 则 <%- code  %>   ,输出  h1大的hello: <%= co

(ADO.NET小知识点汇总)看到什么记什么

1.数据库连接池:在同时连接数不多的情况下, 打开一个链接往数据库导1W条数据的耗时 跟 导一条数据就打开跟关闭数据库连接的耗时 两者其实相差不大,这是为什么呢?打开关闭的本身不是有很多耗时吗?这是因为数据库连接池的存在 当你同时连接数打开的不多的情况下,你关闭一个链接,实际上,这个链接并没有关闭,而是被.Net偷偷藏起来,当然这个藏起来的链接数数量 是有限定的,所以当你导一条,打开关闭一个链接这种方式导数据时,其实并未真正在“打开关闭连接”. 2.批量数据提交:SqlBulkCopy类   以

Android开发之实用小知识点汇总-1

1.去掉android屏幕中的actionbar: 1 this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉标题栏 2 //这个是全屏幕显示的代码 3 this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 3 setContentView(R.layout.logi

Android开发之实用小知识点汇总-2

1.EditText 中将光标移到文字末尾: 1 EditText mEdit = (EditText)this.findViewById(R.id.EditText01); 2 mEdit .setText("abcdefg"); 3 Editable b = mEdit .getText(); 4 mEdit .setSelection(b.length()); 2.Android TextView文字横向自动滚动(***灯效果) (1)重写TextView 1 public cl