ATL字符串转换宏
来源:互联网 发布:java基础入门培训学校 编辑:程序博客网 时间:2024/04/30 05:01
有比MultiByteToWideChar和WideCharToMultiByte更简单的字符串转换宏,你相信吗?
头文件
d:/program files/microsoft visual studio 8/vc/atlmfc/include/atlconv.h
如果要使用ATL字符串转换宏,请先定义
USES_CONVERSION; // 只需要调用一次,就可以在函数中进行多次转换
下面一个例子:
USES_CONVERSION; // 只需要调用一次,就可以在函数中进行多次转换
char a[12] = "china";
::MessageBoxW( NULL, A2W(a), L"", MB_ICONASTERISK|MB_TASKMODAL|MB_OK );
使用 ATL 转换宏,由于不用释放临时空间,所以使用起来非常方便。但是考虑到栈空间的尺寸(VC 默认2M),使用时要注意几点:
1、只适合于进行短字符串的转换;
2、不要试图在一个次数比较多的循环体内进行转换;
3、不要试图对字符型文件内容进行转换,因为文件尺寸一般情况下是比较大的;
4、对情况 2 和 3,要使用 MultiByteToWideChar() 和 WideCharToMultiByte();
使用 ATL 提供的转换宏。
上表中的宏函数,其实非常容易记忆:2好搞笑的缩写,to 的发音和 2 一样,所以借用来表示“转换为、转换到”的含义。AANSI 字符串,也就是 MBCS。W、OLE宽字符串,也就是 UNICODE。T中间类型T。如果定义了 _UNICODE,则T表示W;如果定义了 _MBCS,则T表示ACconst 的缩写
ATL3.0 的字符串转换宏
ATL3.0中常用的字符串转换宏无非是 A2W , W2A , A2T , T2A , A2OLE 等,当然在使用这些宏之前(函数开始处)必须使用USES_CONVERSION 宏。这些宏很大程度上方便了宽字符串与多字节字符串间的转换,但是在使用这些时有一些限制。其中非常重要的一点是,这些宏不宜在循环中使用。 ATL7.0 中的字符串转换 类 和 宏 则很好地避免了这些问题。
ATL7.0 中新的字符串转换 类和宏
ATL7.0 中新的字符串转换 宏 主要有 CA2W , CW2A , CW2T, CA2T , CA2OLE 等。这些宏都是基于CA2WEX 和CW2AEX这两个模板类,同时在进行字符串转换时还可以指定字符串转换时所使用的code page,例如:
- // Specifying the code page.
- void ExampleFunctionW( LPCWSTR pszW )
- {
- // Convert to the utf-8 code page
- ExampleFunctionA( CW2A( pszW, CP_UTF8 ) );
- }
与之前的字符串转换宏相比,两者有如下不同
OLE 等同于W
从上面的对比可以看出ATL7.0 中新的字符串转换 类/宏 相比于旧的字符串转换宏有很大的改进。
在使用新的字符串转换宏时需要注意下面的问题
在使用ATL 3.0 的宏时,可能会有下面的代码
- LPCTSTR szr = A2T( szReplaceFile );
上面的代码是正确的,而在ATL7.0 中类似的
- LPCTSTR szr = CA2T( szReplaceFile );
一般来说却是错误的,如果在后面的代码中使用 szr 时,szr所指向的内存已经被销毁,因为 CA2T的实例已经超出作用域
参考:http://msdn.microsoft.com/en-us/library/87zae4a3(v=vs.100).aspx (ATL and MFC String Conversion Macros)
关于CT2A和CA2T的作用域
之前自己写了4个CHAR与TCHAR的编码函数,后来发现ms早就提供了类似的方法:CA2T CT2A……
但是有同事说,这两个函数不安全,有隐患,没有在意
但是真的用的时候,的确发现它们有些注意事项,简单来说,其实就是作用域的问题
Fun(CA2T(szSrc));
可以,Fun函数用转换后的TCHAR,没问题,因为没有出Fun()这个括号的作用域
tstring strDes = CA2T(szSrc);
可以,因为返回值立刻赋给了strDes,strDes有自己的存储空间,CA2T的数据作用域就在这一行,出了就不要了
TCHAR* szDes = CA2T(szSrc);
失败,这个szDes指向一个已经释放的作用域的值,下一行在用szDes就危险了,没有分配
- ATL 字符串转换宏
- ATL字符串转换宏
- ATL字符串转换宏
- ATL字符串转换宏
- ATL字符串转换宏
- ATL MFC 字符串转换宏
- 谨慎使用ATL X2X字符串转换宏
- ATL X2X字符串转换宏【谨慎使用】
- ATL字符串类型转换
- ATL字符串类型转换
- ATL字符串类型转换
- ATL字符串转换类
- 字符串及处理之七: ATL转换宏
- 转 163的一片blog,ATL字符串转换宏
- ATl中字符转换宏
- ATL 提供的转换宏
- 用ATL的W2A和A2W宏转换Unicode与ANSI字符串
- 用ATL的W2A和A2W宏转换Unicode与ANSI字符串
- 黑马程序员——java基础—000
- unicode 中 CW2A CA2W两个宏的含义
- NSLog 和 printf区别
- 从三字经看古代幼儿教育
- strcpy_s与strcpy的比较
- ATL字符串转换宏
- 读书笔记: More Effective C++ 基础议题,条款1到条款4
- 云服务器试用小计-centos
- 搭建一个应用程序框架-做点什么
- stren 和sizeof的区别
- 迭代器模式(Iterator)
- fork()两次不同返回值的实现
- 反转单向链表
- 汇聚互联网段地址api 的使用