聊聊我对c/c++的认识
/******************************************************************
*本文首发于bbs.bluegem.org的CWorld区
*本人email:[email protected]
*如转载本文,请保留首发地和本人联络方式,以方便交流,谢谢!
******************************************************************/
首先:c和c++完全是两种不同的语言,虽然c++有时候看起来很像c。他们最主要的差别在于编程的思想。
无论c还是c++都不完全是高级语言,他们很大程度上与平台有紧密地联系。这里的“平台”即可能指不同的硬件平台,比如x86、powerpc、spar或者64位的amdOpteron;也指特定的软件平台,通用的有linux、win32,非通用的比如某块语音卡、ibm的MQ。所以学习c/c++就要把握两方面的知识,与平台无关或者说c/c++语言本身的特性和与平台相关的特性。
下面就先说说与平台无关的知识。
1、语法。这个基本上没什么可讲的。熟练掌握最常用的,知道什么地方是雷区,注意一些细节问题,比如sizeof()在不同context中的结果、函数的形参和实参、类的拷贝构造函数等。
2、标准库。无论c还是c++,语言本身都提供了强大的标准库,比如string、errno、time尤其是c++中的stl等。对标准库的熟悉可以让我们的编程工作少走弯路,而且标准库的实现是最高效最稳定的。我想微软的msdn是最好的电子文档之一。
3、编程规范或者说习惯。这是一名合格的程序员的必要条件,也是从学生程序员蜕变为职业程序员的重要标志。想在这方面提高的朋友可以参考林锐博士的《高质量C++_C编程指南》、网文《编程修养》等,最好的办法当然是进入一家管理正规的公司接受正规培训。其实编程规范没必要墨守成规,不同的单位甚至不同的项目对规范的要求都不一样,能把程序写清楚,代码稳定、易读、易维护、专业并且符合单位的相关规定就可以了。
4、编程的工程管理。编程规范是针对个人的,而工程管理则是针对负责项目的所有程序员。工程管理首先强调的是接受管理的能力,如果上级交付的任务都不能按要求完成,那就……其次个人是否能把自己负责的模块管理得很科学,比如项目文件的安排(这方面win32的程序员要幸运的多,无论vc还是bcb都已经把项目的管理做得很好了,而大部分的*nix程序员,要自己来做这部分工作),还有函数的功能划分设计等。这些都是小规模的项目管理实践。一些既有天赋又勤奋努力的程序员会逐步走成长为项目组长直至cto,负责项目整体的管理。具体的管理方法很多,比如学院派的cmm等。再说大点,项目达到一定规模后,狭义的软件工程已经无法适应项目管理的需求,程序员要求助于传统工程的一些管理思想和手段。
5、编程思想。编程思想工程的指导思想,好比伟大的毛泽东思想之于中国革命实践。c/c++的编程思想存在很大差异。c强调面向过程理论,c++强调面向对象理论。随着技术进步面向过程理论不能满足时代的需要,主要体现在大项目上,使用纯粹面向过程的方法进行开发,程序员往往陷入如何实现前人已经实现的功能,尤其设计gui部分,很难把精力集中于业务逻辑;而且代码纷乱,难以实施有效的维护和二次开发。面向对象理论解决了这一问题,但这并不意味着面向过程理论被淘汰了,任何面向对象的语言在具体功能模块实现时依然使用面向过程的三板斧:顺序、条件选择和循环。从这个角度看面向过程不但没有弱化,反而比以前更重要了。面向对象编程的核心目的就是复用,把经常做的一些工作封装好,让程序员把精力集中于业务逻辑。c++的编程思想中还有个重要特性:范型编程,比如stl。请注意,stl并不是面向对象的产物。
其实能真正把面向过程的c做好的人也不是很多,能在c++方面造诣很深的人就更少了,至少我就不是:(。很多时候我们写的程序只能称为“基于对象”的。
再说说与平台相关的知识。
1、系统级的数据类型和api。先说数据类型,很古老的例子,16位机器和32位机器的int字长分别是两字节和四字节。再说数据类型,ms在标准数据类型的基础上又定义了N多数据类型,写过vc的人恐怕是深受其害。看那些linux跨操作系统平台的软件源代码也会发现无数的#ifdef....。系统级的api一般都是c的接口,win32有sdk、directX等,典型函数有winmain()、SendMessage();linux的glibc,典型函数有setuid()、tmpfile()。
2、非通用平台的数据类型和api。还有一些特定的软硬件环境也提供特定的数据类型和api,比如加密卡、数据传输卡提供的驱动;ibm的mq(mq就提供c和c++两套接口api)。
3、不同的类库。用c++工作在不同的平台下要熟悉相关类库,比如ms的mfc,跨平台的通用库有boost,我还曾经用过一个加/解密算法库crypto++(crypto++也提供c和c++两套接口api)。学会重用前人的代码也是一门功夫。
开发总是在特定平台下进行的,所以熟悉至少一个系统级的api或者类库是必须的。根据工作中不同的侧重和项目的要求还要熟悉一些特定的库。比如我原来经常用到一些加解密算法,我就必须对crypto++非常熟悉。另外,熟悉和使用一些公共用途的库比如boost,对开发工作有事半功倍的效果。
4、了解程序编译、连接的过程。库的静态链接、动态链接以及库的动态载入和卸载。项目做大了,自然不能一个可执行文件就把全部问题都解决了。ms平台下的程序员请参考msdn,linux程序员可以参考《advanced-linux-programming》
5、无论在何种平台下工作至少要熟悉一种开发调试工具。windows程序员很幸福,ms提供了集成开发环境visual c++(.net),borland提供了bcb;传统linux程序员一般使用gcc和gdb,目前linux下也有很多集成开发环境,大大方便了开发工作。
以上这些不太可能几天内全部看完,需要在工作中逐步提高。最初还是把注意力放在语法、规范和标准库方面,把基础打扎实为宜。随着工作经验的增加,在工程中会逐步处于主导地位,负责一些整体设计的工作。这时再做项目,就要有意识的运用面向过程或者对象的理论进行设计,制定符合自己项目的代码规范。在动手前仔细想想可能用到哪些功能模块,有没有可能复用前人的代码,这些被复用的代码正确性和效率是不是符合自己的要求?
孔子说学而不思则罔,做完项目后休息调整一段时间,再从设计到具体编码重新审视一边,会有很多心得。平时经常看看标准库和系统的库,多熟悉公共用途的库比如boost,有备无患。除了刚才提到得这些具体实现技术外,如果能高屋建瓴地看些编程思想方面的知识则更好,提高内功,比如《thinking in c++》《设计模式》等都是很好的学习材料。
现在有很多公开源码的优秀项目,阅读这些项目的代码,找出其中的bug并与作者进行交流,也是提高技术水平的重要途径。
在某些大项目中,有可能给别人提供api编程接口,接口的定义需要双方协商制定,风格尽量向标准库或者mfc、boost这样的专业库靠拢。
这篇文章当中讲的都是传统的编程,随着时代的发展出现很多新技术,比如以java和.net为代表的n层结构(可以参考我的另一篇文章《我的Java之路一》);还有activX、COM、CORBA,基本都是围绕internet展开的,初衷是跨平台,最核心的目的依然是复用。了解掌握这些技术,既是增加了自己一门专业技能,对加深传统编程的理解也非常有好处。
本文地址:http://com.8s8s.com/it/it1048.htm