一、在解释_T()和L的区别前,我们需要先了解一下字符集,字符集分为:Unicode字符集和多字节字符集,我这里开发环境以VS2010为例,打开项目属性,右击项目在弹出的下拉列表框里选择属性。如下图(图1)
在属性页依次展开:配置属性-常规,然后在项目默认值里找到字符集。如下图(图2)
二、我们先把字符集配置成Unicode字符集,来看看在代码编程里使用字符串的实际情况。如下图(图3)
图中字符串前面没有加_T()或L,在使用InsertItem函数时提示错误(Error:函数调用中的参数太少)。而真正导致错误的原因是字符串的使用。程序编译后提示的错误中也可以分析是字符串转换的问题(不能将参数 2 从“const char [5]”转换为“TCITEMW *”)。
此时我们只要在字符串前面加上L或_T()就可以修正错误,使其编译通过。如下图(图4)
三、L的作用是告诉编译器使用两个字节的Unicode字符集,_T()宏可以根据你的环境配置,使编译器选择合适的(Unicode还是ANSI)字符处理方式。
如果配置的是Unicode,那么_T()宏会把字符串前面加一个L。这时_T("你好")等于L"你好"
如果配置的是多字节,那么_T()宏不会在字符串前面加 L ,此时_T("你好")等于 "你好"
四、我们再把字符集配置成多字节字符集,看看会发生什么,如下图(图5)
从图中可以看出_T()宏的代码不会报错,加 L 的这行代码报错了。编译后提示错误( 不能将参数 2 从“const wchar_t[3]”转换为“TCITEMA *”),此时只要把 L 去掉就可以编译通过。
五、总结:可以把_T()宏认为是通用型。L使用在字符集配置为Unicode字符集时。