Blog Suggest

今天早上爬起来,看到一篇非常非常好的文章:你应当如何学习 C++(以及编程)(rev#1) [href: http://blog.csdn.net/pongba/archive/2007/05/16/1611593.aspx ]。

由于文章和评论都相当的长,而且作者加了 rev#1, 大概还是准备把这篇文章继续写和修改下去,我就不在博客里全文引用了。这篇文章和它的所有评论都值得仔细读一遍。

其实在一开始我学习的语言就是 C++,显然在一般情况下,教授 C++ 的书和教授都会每每提及 C 指出它的不足和 C++ 的优点。我在学校期间也丝毫不掩饰对 OO 的 C++ 的热爱和对简陋的 C 语言的鄙视,并因之也鄙视那些学 C 语言的人。当我听谁谁谁说正在学习 C 的时候我就会告诉他/她,C 语言已经过气了,功能太简陋而且要成为历史词汇了,还是学 C++ 吧!大概是因为 C++ 比 C 多了那么两个让人感觉骄傲的加号,当时愚蠢地以为学习 C++ 的人都能比学 C 的人更加地昂起头走路,想想真是太 rediculous 了。

我在大学期间也学了不少语言,虽然说没有太深入了解,但基本的使用还是没问题的。也曾经师从吴朝阳学习并分析过 STL 的代码,语言间的比较和对库深入的学习,也让我更加深信 C++ 的优越性。当时的我甚至非常愚蠢地认为,既然有 C++,C 语言早就应该淘汰了。

但是这些认识当我真正开始写工程应用的 C 语言代码时完全改变了,大学期间实验性的代码能说明的问题太少了。我仍然承认 C++ 很优秀,是很好的程序设计语言,但是并不是每个项目每个人都适合用 C++。在现在的我看来,C++ 太累赘了,除非是有非常好的可以使用 template 的环境,我不会选择 C++ 做为开发语言。很可能有 C++ 的狂热爱好者会鼓吹面向对象的设计,封装、派生、多态等等一些乱七八糟的理论(其实我以前也是其中的一个),但是,就像 云风 在博客里所说:"不过对这些(C++ 和 OO)了解的再多也不为多,每次面临新的设计时,就可以找到足够的理由不用 C++ 不用 OO 。对,就算是用 OO ,我也可以保证对象设计的整洁清晰;但我更清楚的知道,其实我可以不用它。"

我不像云风那样有着那么多年的游戏设计和开发经验,还没有过自己设计一个软件的机会。但是在我移植 GDB 的时候,我越来越体会到 C 语言的美好。我真的想劝说那些鼓吹 C++ 的人,请读读 Linux/Unix Kernel, GCC, GDB 的代码,就算你读过以后仍然坚信 C++ 是最好的,但我相信你不会再认为 C 语言是个垃圾语言并不再适用于当今时代。你会发现很多很多需要使用对象或者其它 C++ 特性的部分都可以通过精巧的设计来避免,而且虽然鼓吹 C++ 的人一直会宣扬 C++ 的代码重用可以精简代码等等,但在应用中你就会发现,C++ 代码的规模在正常情况下要远比同等功用的 C 语言的大(否则嵌入式领域就不是 C 语言的天下了)。

还有一点我很不满 C++ 的地方是在 GDB 的使用上,相信用 GDB 调试过 C++ 代码的人都深有体会。Readline library 并不支持双冒号"::"在命令中的自动补全,所以在成员函数上设断点是非常痛苦的事情。当程序中使用模板的时候,一个函数标识符的长度会很轻松的上几百,命令行补全一失效,不得不手工输入。所以当需要在类的成员函数上设置断点的时候,都要使用一些技巧。比如在类名上使用命令自动补全,在列表中寻找到自己需要的函数,拷贝保存下来它的名字,然后再通过粘贴设置断点。如果仔细点儿你就会发现,成员函数的第一个参数其实是 this 而不是在函数声明时候的第一个参数,这会在调试期产生误解。C++ 简化了程序员的思考,但是让底层的中间文件和目标文件变得更加混乱。

C++ 很优秀,但不是万能灵药。不是学了 C++ 就了不起,不是学了 C 就低人一等,就像 pongba 所说:"一般性的编码实践准则,以及基本的编程能力和基本功,乃至基本的程序设计理论以及算法设计。才是真正需要花时间掌握的东西。" "熟练运用一门语言绝不意味着要把它的边边角角全都记住。"

——但,C++ 的犄角旮旯实在太多了!

最后,特别推荐 pongba 的博客"C++的罗浮宫"[href: http://blog.csdn.net/pongba ]。pongba 者,刘未鹏也,南京大学数学系 2001 级,也算是我的直系师兄了(^_^)。翻译过:Working Effectively With Legacy Code, Exceptional C++ Style, Imperfect C++。

《Blog Suggest》上有5条评论

  1. 看了,是篇好文章,前些天还在看C++,细节的东西太多了。
    你的移植GDB是个好活啊,学到了那么多东西,小牛人......

  2. To:zz 师兄
    偶并没有去那里跳坑,我跳到自己的博客里了 :)

    To:Jierea
    C++,我学的也是很痛苦
    虽然学过很多,但真正想起来,往往觉得什么都不会

  3. 虽然学过很多,但真正想起来,往往觉得什么都不会
    深有同感,感觉就像打架时拿着金箍棒,就差自己不是孙大爷

  4. “就像打架时拿着金箍棒,就差自己不是孙大爷”哈哈这句话说的有意思

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注