热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

白乔原创:备受争议的VisualC++

白乔原创:备受争议的VisualC++--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
Visual C++为了让程序员能够自由的使用C++语言完成Windows应用程序的编写,可谓“煞费苦心”,然而,同时因为一些原因Visual C++却饱受争议。这些争议包括以下5点。

1.关于Visual C++对标准C++的支持

前面谈到,Visual C++不是唯一的C++编译器提供者,在linux环境下,GCC就很有知名度。而由于历史原因,Visual C++6.0推出的时候,C++的标准还未形成,Visual C++ 6.0对标准C++的支持很差,据上面的数字来说,它只到70%左右。

但是细想,C++的标准化是什么时候?C++自推出以来,其标准只有一个:即1998年由美国国家标准化协会ANSI和国际标准化组织ISO正式发布的C++语言的国际标准C++98(ISO/IEC 14882:1998)。再来看看1998年的Visual C++6.0,那时的Visual C++6.0已经作为成熟的产品推出,其中包含了一些相对前卫的C++特性。就像要求山顶洞人围猎时必须带有狩猎证一样,我们怎么可以指望VisualC++ 6.0包含对标准C++的完整支持呢?当然,在前面的内容我们也讲到了,VisualC++在后面的版本增强了对标准C++的支持,并使支持率达到98%以上!所以,对那些希望学习标准C++的读者来说,千万不要再抱着VisualC++ 6.0不放了。

提示

关于C++的标准化,2003年10月15日,ISO推出了C++标准的第2版C++2003(ISO/IEC 14882:2003)。该版本在语法特征上没有什么变化,只是纠正了原版的各种错误,并进行了一些技术上的修订。

2.关于Visual C++的体积

在以上几个版本中,Visual C++ 6.0是最小的Visual C++,它的体积大概是一张CD,然而发展到Visual C++2008,其体积可以达到2GB!因此很多程序员对于Visual C++的第一印象是太过臃肿,实际上,VisualC++之所以能够这么肥胖,是因为它提供了更多、更强的功能。Visual C++的界面友好性及与其他系统(如:MicrosoftOffice)的集成性,是谁也不可否认的。在存储空间的成本日益变得廉价的今天,该特性不应成为程序员选择Visual C++的否决因素。

3.关于Visual C++的MFC

MFC是Visual C++的灵魂,至少对其最初的版本来说是这样。然而,MFC让程序员产生了强烈的“MFC依赖症”,一旦离开了MFC,程序员就很难编写出合适的程序,这让Visual C++显得与其他开放技术的不兼容。

MFC将常见的Windows对象和操作都封装起来了,这让程序员感觉到自己是一位面对黑色宇宙的宇航员,一旦离开了宇宙飞船,就会晕菜。至于宇宙飞船为什么可以飞起来,如果一个程序员缺少足够的时间和能力,就很难再去研究。如果一个VisualC++程序员不知道如何使用代码手动的实现一个消息映射,那就很难掌握到真正的MFC。

一言以蔽之,MFC的不幸在于:其高超的封装性反而让程序员望而却步,进而招来更多的负面评价:MFC不好用、MFC是封闭的、Visual C++是可怕的。
微软应该也意识到了这个问题,将所有的程序基于MFC来开发是很可怕的。因此他们提出了ATL,将那些小型的、有用的类扔到ATL里面去,而不必再依赖于MFC环境。比如:当读者编写一个使用CString的程序,就不再需要MFC。如果想将一堆CString扔进一个map当中去,也可以不使用MFC。

4.关于Visual C++的语言扩展

如果你参与过Java语言的开发,你会发现有些事情在Java语言中实现起来轻而易举:





该段代码演示了如何获取一个对象的类信息,并从一个类创建一个实例对象。在C++语言中,要实现类似的功能简直比登天还难!但是VisualC++觉得它应该帮助程序员来做这件事,遗憾的是它骨子里还是C++,先天不足,所以最后它不得不依靠一些旁门左道(如:宏)等非正当的手段来维护一个属于自己的王国,而这个王国的基础就是CObject及CRuntimeClass。在VisualC++项目中,很难找到与CObject、CRuntimeClass完全无关的代码,程序员可以通过CObject、CRuntimeClass拥有超强的能力,但是也常常会因为这些黑幕技术感到困惑。

5.关于Visual C++的语法扩展

在Visual C++.NET中,你可以使用如下语句:





这段代码被称做托管代码,它采用了C++/CLI(CLI:Common LanguageInfrastructure)语言(在某段时间,这门语言被称做“托管C++”语言)。“CLI”即公共语言基础结构(CommonLanguageInfrastructure),这是一个支持动态组件编程模型的多层架构。在许多方面,它所表示的对象模型和C++的完全相反。它是一个运行时软件层,一个虚拟执行系统,运行在应用程序和底层操作系统之间。斜线“/”表示它是静态C++对象模型到动态CLI组件对象模型的一种绑定。

C++/CLI语言在兼容原有的C++标准的同时,重新简化了托管代码扩展的语法,提供了更好的代码可读性。和微软.NET的其他语言一样,微软向ECMA提交了C++/CLI的标准化请求,并且被ECMA通过成为正式的标准。C++/CLI现在可以被Visual C++2005和更高版本的编译器支持。

大家知道,.NET框架封装了大量的API,例如网络访问、字符串操作、数据访问、XML服务、图形界面控件库、邮件服务、加密服务、文件输入/输出,甚至是WMI管理,也使得应用程序员可以编写更加简洁的代码。通过采用C++/CLI,传统的C++代码可以较快地移植到新的平台上,而且即使不完全重写代码,也可以通过互操作在同一个模块中无缝整合托管和非托管代码,从新的.Net框架中获益。一个比较显著的特性是:使用C++/CLI编写托管代码,内存管理的工作可以让CLR去自动处理,访问时也增加了类型检查,减少了缓冲区溢出和内存泄漏的危险,增加了程序的稳定性。

按理说,这项发明应该值得C++程序员为之欢欣鼓舞,但是,传统的C++程序员对C++/CLI的态度极其复杂。更有甚者,称C++/CLI为“被阉割的C++”。C++/CLI彷徨在标准C++与C#之间,进退两难。

===========================================



以上摘自《把脉VC++》第2.1.4小节的内容 ,如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533
推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
author-avatar
討厭香菇_748
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有