VS2005

VS2005是是非非(一)——CString
2008年02月22日 星期五 10:32
引言
    VS2005 对很多人来讲很陌生,它也是引发非议很多的IDE,大致罗列一下:
  • 他对C++标准和C++模版的支持很好,如:for(int i; i < 10; ++i)变量i作用域为for语句块,支持嵌套模版参数等。
  • 它的编译报错是众多编译器中非常友好的,优化之类那是自然的了(不太清楚,不敢妄言)。
  • 占用内存过多,启动太慢。
  • 与老版本程序兼容不好,很多系统库做了改进,如:MFC,ATL。
  • VS2005编译的程序部署的困难(不太清楚一些运行期库的依赖,VS2005编译的程序常常无法在一些没安装VS2005的系统上运行)。
     好了,上面或对或错源于不了解而引发的误解。希望看到这里的朋友指点。

程序入口
   
随便建立一个WINDOWS(测试过MFC应用)程序,VS2005默认为UNICODE字符集,如果要改为非UNICODE字符集时会出现如下链接错误:
msvcrtd.lib(wcrtexew.obj) : error LNK2019: unresolved external symbol _wWinMain@16 referenced in function ___tmainCRTStartup
   更改Linker/Advanced/Entry Point为 WinMainCRTStartup 即可。
   程序入口有四种形式
  • UNICODE Windows 为wWinMainCRTStartup
  • UNICODE Console为wmainCRTStartup
  • 非UNICODE Windows为WinMainCRTStartup
  • 非UNICODE Console为mainCRTStartup
引发问题
      以上讨论的关键是对不同字符集和不同子系统应用程序的不理解而引发的一些编译链接问题,尤其是字符集问题,它是很令人头痛的问题,下面是我遇到的其中之一( 理解数据对齐中作了部分讨论)。

    一) VS2005中CString已经与VC6中的不同了,它的字符“缓冲”用的是宽字符。这里使用UNICODE字符集的工程CString没有问题,而对于非UNICODE的应用不能正常从资源中载入中文字符。
    导致原因是中文转换为MBCS字符集时出错,或许转换函数(WideCharToMultiByte)需要一些本地语言区域等的设置。我也没有完美的解决方案,老的工程中有很多这样烦人的东西是他们很难被移植的VS2005中。慢慢熟悉吧。
 

VC中的Unicode编程

减小字体 增大字体 作者:Ahaoz.CoM  来源:本站整理  发布时间:2005-11-25 17:43:13
 

VC中的Unicode编程

    在windows下编程还是支持unicode吧,大势所趋啊,window 2k以后的系统底层都是基于Unicode的,就算你调用ANSI的API(以A结尾比如SetWidowsTextA),系统也会在你的进程默认堆上动态分配一块内存,存放转换后的Unicode字符串,然后把转换后的字符串传递给API,如果调用了返回值为ANSI字符串的API,Windows会在后台进行相反的转换,多浪费时间啊!!就算不考虑效率问题,难道你不想让你的软件国际化吗?你还想面临半个汉字等尴尬的问题吗?

    其实VC中进行Unicode编程也不麻烦,大概如下:
1.为工程添加UNICODE和_UNICODE预处理选项,在VC.net中就是 项目 -> 属性 -> c/c++ -> 预处理器 在"预处理定义"中加入这两个宏定义(vc6中 project -> settings -> c/c++ -> general 中的 Preprocessor definitions).

2.Include <TCHAR.h> (一般在stdafx.h中)然后把所有使用char*定义变量的地方换为LPTSTR/TCHAR*或LPCTSTR/const TCHAR*(对应于const char*).

3.把所有的字符串常量用_T()宏包起来,比如 TCHAR* szText = _T("我的Text");

4.所有的C库字符串操作函数也做相应的替换,比如
strlen ->_tcslen
strcat ->_tcscat
strcmp ->_tcscmp
......
    注意,这些函数中的"文本长度"均为字符个数,而非char个数具体参看MSDN.

5.API调用一般不用做特殊处理,当定义了UNICODE和_UNICODE后,所有的API都会被宏指向W结尾的版本(不定义则指向A结尾的版本).

    其实,上面所说的并非强制你使用UNICODE,如果你还想回去使用ANSI,没有问题,把第一步定义的两个宏拿掉就OK了,继续我们的ANSI编程!!
:)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值