- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MFC一些调用的步骤
MFC一些调用的步骤
1、第一步,全局对象“theApp”的构造函数;
?
2、真正的main函数隐藏在框架内,IDE下 按F11可以进入Main函数
?
3、跳转到AfxWinMain函数,看到调用了“InitInstace”虚函数,另外CWinAPP原来是从CWinThread派生的,是一个线程,以前没注意
?
4、最后进入了CWinThread::Run函数,也就是进入了消息泵
AfxMessageBox引起死机
1、在CListCtrl右键菜单的执行中;
2、AfxMessageBox的数据量4K左右;
结论:不要用AfxMessageBox显示大量的数据
VC++ 6.0的小花招
Visual Studio系列中产品中,Visual Studio 6.0是最经典的一个版本,虽然后来有Visual Studio .NET 2003,以及2005,也确实添加了很多让我觉得激动的特性,但是从使用细节的细腻程度上来看,VS 6.0无疑是最棒的。我们一些同事甚至试图把2005的C++编译器独立的拿到Visual Studio 6.0中来用,也不愿意升级到.NET上来用,可见其魅力。
?
和VS 6.0这个产品的成熟相比,VC++ 6.0的编译器的的确确相对来说有些糟糕,其中最被诟病的是对模板技术支持很不好。下面我想做的一件事情,就是向那些继续留恋VC++ 6.0的朋友,介绍一些小花招,来避开VC++ 6.0的一些编译器缺陷。
?
?
1)for (type var=expression;;) 中变量var的作用域问题。
?
按照C++标准,这里定义的变量var出了for循环应该被销毁。也就是说下面这段代码是有效的:
?
?? for (int i = 0; i 100; ++i)
?????? func();
?? for (int i = 0; i 100; ++i)
?????? func2();
?
而下面这段代码应该编译不过:
?
??? for (int i = 0; i 100; ++i)
??? {
???????? if (has_found_it())
???????? {
???????????? handle_find_result();
???????????? break;
????????? }
??? }
??? if (i == 100)
???????? do_not_found();
?
然而VC++ 6.0对于第一段代码会报变量i重复定义错误,而第二段代码编译通过。
?
为了让VC++ 6.0的for语句看起来符合C++标准,你可以这样做:
?
?? #define for if (0); else for
?
你会发现很有趣,这样define一下后,VC++ 6.0的for语句完全符合C++标准了!而且由于编译器的优化,Release版本不会增加任何额外的开销。
?
喜欢“钻牛角尖”的朋友可能会说:嗯,不错的主意。但是——为什么不这样做:
?
?? #define for if (1) for
?
嗯?看起来也可以。还是让我们看一个用例:
?
?? if (cond)
????? for (int i = 0; i 100; ++i)
????????? func1();
?? else
?????? func2();
?
进行宏代码展开后,成为:
?
?? if (cond)
?????? if (1)
?????????? for (int i = 0; i 100; ++i)
?????????????? func1();
?????? else
?????????? func2();
?
这个结果显然不能符合我们的原意。这里func2();语句永远得不到执行机会。
?
?
2)模板参数类型如果不出现在参数列表中,则不能作为返回值类型。
?
由于编译器的缺陷,VC++ 6.0不支持以下这种用法:
?
?? template class T1, class T2
?? T1 func(T2 arg)
?? {
?????? T1 var;
?????? ... // 处理var过程
?????? return var;
?? }
?
?? void test()
?? {
?????? int result1 = funcint(1);
?????? double result2 = funcdouble(2);
?? };
?
很抱歉,这种用法VC++ 6.0不支持。让人恼火的是,VC++ 6.0编译时不会提示错误,但是生成的执行代码却很成问题。
?
究其原因,是因为VC++ 6.0的template技术是在编译器的较高层次做的,真正的编译器核心并不考虑模板。以上面
文档评论(0)