C++的坑真的多吗?

C++的坑真的多吗?

先说明一下,我不希望本文变成语言争论贴。希望下面的文章能让我们客观理性地了解C++这个语言。(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价值。我们应该多看看技术是怎么演进的,怎么取舍的。)

事由

周五的时候,我在我的微博上发了一个贴说了一下一个网友给我发来的C++程序的规范和内存管理写的不是很好(后来我删除了,因为当事人要求),我并非批判,只是想说明其实程序员是需要一些“疫苗”的,并以此想开一个“程序员疫苗的网站”,结果,@简悦云风同学直接回复到:“不要用 C++ 直接用 C , 就没那么多坑了。”就把这个事带入了语言之争。

我又发了一条微博

@左耳朵耗子 新浪个人认证 : 说C++比C的坑更多的人我可以理解,但理性地思考一下。C语言的坑也不少啊,如果说C语言有90个坑,那么C++就是100个坑(另,我看很多人都把C语言上的坑也归到了C++上来),但是C++你得到的东西更多,封装,多态,继承扩展,泛型编程,智能指针,……,你得到了500%东西,但却只多了10%的坑,多值啊

结果引来了更多的回复(只节选了一些言论):

  • @淘宝褚霸也在微博里说:“自从5年前果断扔掉C++,改用了ansi c后,我的生活质量大大提升,没有各种坑坑我。
  • @Laruence在其微博里说: “我确实用不到, C语言灵活运用struct, 可以很好的满足这些需求.//@左耳朵耗子: 封装,继承,多态,模板,智能指针,这也用不到?这也学院派?//@Laruence: 问题是, 这些东西我都用不到… C语言是工程师搞的, C++是学院派搞的

那么,C++的坑真的多么?我还请大家理性地思考一下

C++真的比C差吗?

我们先来看一个图——《各种程序员的嘴脏的对比》,从这个图上看,C程序员比C++的程序员在注释中使用fuck的字眼多一倍。这说明了什么?我个人觉得这说明C程序员没有C++程序员淡定

Google Code 中程序语言出现 fuck 一词的比率

不要太纠结上图,只是轻松一下,我没那么无聊,让我们来看点真正的论据。

相信用过C++的程序员知道,C++的很多特性主要就是解决C语言中的各种不完美和缺陷:(注:C89、C99中许多的改进正是从C++中所引进的

  • 用namespace解决了很C函数重名的问题。
  • 用const/inline/template代替了宏,解决了C语言中宏的各种坑。
  • 用const的类型解决了很多C语言中变量值莫名改变的问题。
  • 用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。
  • 用强类型检查和四种转型,解决了C语言中乱转型的各种坑。
  • 用封装(构造,析构,拷贝构造,赋值重载)解决了C语言中各种复制一个结构体(struct)或是一个数据结构(link, hashtable, list, array等)中浅拷贝的内存问题的各种坑。
  • 用封装让你可以在成员变量加入getter/setter,而不会像C一样只有文件级的封装。
  • 用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。
  • 用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。
  • 用RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。
  • 用OO和GP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。
  • 用STL解决了C语言中算法和数据结构的N多种坑。
(注意:上面我没有提重载运算符和异常,前者写出来的代码并不易读和易维护(参看《恐怖的C++语言》后面的那个示例),坑也多,后者并不成熟(相对于Java的异常),但是我们需要知道try-catch这种方式比传统的不断地判断函数返回值和errno形成的大量的if-else在代码可读性上要好很多)

上述的这些东西填了不知有多少的C语言编程和维护的坑。少用指针,多用引用,试试autoptr,用用封装,继承,多态和函数重载…… 你面对的坑只会比C少,不会多。

C++的坑有多少?

C++的坑真的不多,如果你能花两到三周的时候读一下《Effecitve C++》里的那50多个条款,你就知道C++里的坑并不多,而且,有很多条款告诉我们C++是怎么解决C的坑的。然后,你可以读读《Exceptional C++》和《More Exceptional C++》,你可以了解一下C++各种问题的解决方法和一些常见的经典错误。

当然,C++在解决了很多C语的坑的同时,也因为OO和泛型又引入了一些坑。消一些,加一些,我个人感觉上总体上只比C多10%左右吧。但是你有了开发速度更快,代码更易读,更易维护的500%的利益。

另外,不可否认的是,C++中的代码出了错误,有时候很难搞,而且似乎用C++的人会觉得C++更容易出错?我觉得主要是下面几个原因:

  • C和C++都没学好,大多数人用C++写C,所以,C的坑和C++的坑合并了。
  • C++太灵活了,想怎么搞就怎么搞,所以,各种不经意地滥用和乱搞。

另外,C++的编译对标准C++的实现各异,支持地也千差万别,所以会有一些比较奇怪的问题,但是如果你一般用用C++的封装,继承,多态,以及namespace,const, refernece,  inline, templete, overloap, autoptr,还有一些OO 模式,并不会出现奇怪的问题。

而对于STL中的各种坑,我觉得是程序员们还对GP(泛型编程)理解得还不够,STL是泛型编程的顶级实践!属于是大师级的作品,一般人很难理解。必需承认STL写出来的代码和编译错误的确相当复杂晦涩,太难懂了。这也是C++的一个诟病。

这和Linus说的一样 —— “C++是一门很恐怖的语言,而比它更恐怖的是很多不合格的程序员在使用着它”。注意我飘红了“很多不合格的程序员”!

我觉得C++并不适合初级程序员使用,C++只适合高级程序员使用(参看《21天学好C++》和《C++学习自信心曲线》),正如《Why C++》中说的,C++适合那些对开发维护效率和系统性能同时关注的高级程序员使用。

这就好像飞机一样,开飞机很难,开飞机要注意的东西太多太多,对驾驶员的要求很高,但你不能说飞机这个工具很烂,开飞机的坑太多。(注:我这里并不是说C++是飞机,C是汽车,C++和C的差距,比飞机到汽车的差距少太多太多,这里主要是类比,我们对待C++语言的心态!)

C++的初衷

理解C++设计的最佳读本是《C++演化和设计》,在这本书中Stroustrup说了些事:

1)Stroustrup对C是非常欣赏,实际上早期C++许多的工作是对于C的强化和净化,并把完全兼容C作为强制性要求。C89、C99中许多的改进正是从C++中所引进。可见,Stroustrup对C语言的贡献非常之大。今天不管你对C++怎么看,C++的确扩展和进化了C,对C造成了深远的影响

2)Stroustrup对于C的抱怨主要来源于两个方面——在C++兼容C的过程中遇到了不少设计实现上的麻烦;以及守旧的K&R C程序员对Stroustrup的批评。很多人说C++的恶梦就是要去兼容于C,这并不无道理(Java就干的比C++彻底得多,但这并不是Stroustrup考虑的,Stroustrup一边在使尽浑身解数来兼容C,另一方面在拼命地优化C。

3)Stroustrup在书中直接说,C++最大的竞争对手正是C,他的目的就是——C能做到的,C++也必须做到,而且要做的更好。大家觉得是不是做到了?有多少做到了,有多少还没有做到?

4)对于同时关注的运行效率和开发效率的程序员,Stroustrup多次强调C++的目标是——“在保证效率与C语言相当的情况下,加强程序的组织性;能保证同样功能的程序,C++更短小”,这正是浅封装的核心思想。而不是过渡设计的OO。(参看:面向对象是个骗局

5)这本书中举了很多例子来回应那些批评C++有运行性能问题的人。C++在其第二个版本中,引入了虚函数机制,这是C++效率最大的瓶颈了,但我个人认为虚函数就是多了一次加法运算,但让我们的代码能有更好的组织,极大增加了程序的阅读和降底了维护成本。(注:Lippman的《深入探索C++对象模型》也说明了C++不比C的程序在运行性能低。Bruce的《Think in C++》也说C++和C的性能相差只有5%)

6)这本书中还讲了一些C++的痛苦的取舍,印象最深的就是多重继承,提出,拿掉,再被提出,反复很多次,大家在得与失中不断地辩论和取舍。这个过程让我最大的收获是——a) 对于任何一种设计都有好有坏,都只能偏重一方,b) 完全否定式的批评是不好的心态,好的心态应该是建设性地批评

我对C++的感情

我先说说我学C++的经历。

我毕业时,是直接从C跳过C++学Java的,但是学Java的时候,不知道为什么Java要设计成这样,只好回头看C++,结果学C++的时候又有很多不懂,又只得回头看C最后发现,C -> C++ -> Java的过程,就是C++填C的坑,Java填C++的坑的过程

注,下面这些东西可以看到Java在填C/C++坑:

  • Java彻底废弃了指针(指针这个东西,绝对让这个社会有几百亿的损失),使用引用。
  • Java用GC解决了C++的各种内存问题的诟病,当然也带来了GC的问题,不过功大于过。
  • Java对异常的支持比C++更严格,让编程更方便了。
  • Java没有像C++那样的template/macro/函数对象/操作符重载,泛型太晦涩,用OO更容易一些。
  • Java改进了C++的构造、析构、拷贝构造、赋值。
  • Java对完全抛弃了C/C++这种面向过程的编程方式,并废弃了多重继承,更OO(如:用接口来代替多重继承)
  • Java比较彻底地解决了C/C++自称多年的跨平台技术。
  • Java的反射机制把这个语言提升了一个高度,在这个上面可以构建各种高级用法。
  • C/C++没有一些比较好的类库,比如UI,线程 ,I/O,字符串处理等。(C++0x补充了一些)
  • 等等……

当然时代还在前进,这个演变的过程还在C#和Go上体现着。不过我学习了C -> C++  -> Java这个填坑演进的过程,让我明白了很多东西:

  • 我明白了OO是怎么一回事,重要的是明白了OO的封装,继承,和多态是怎么实现的。(参看我以前写过的《C++虚函数表解析》和《C++对象内存布局》)
  • 我明白了STL的泛型编程和Java的各种花哨的技术是怎么一回事,以及那些很花哨的编程方法和技术。
  • 我明白了C,C++,Java的各中坑,这就好像玩火一样,我知道怎么玩火不会烧身了。

我从这个学习过程中得到的最大的收获不是语言本身,而是各式各样的编程技术和方法,和技术的演进的过程,这比语言本身更重要在这个角度上学习,你看到的不是一个又一个的坑,你看到的是——各式各样让你可以爬得更高的梯子

我对C++的感情有三个过程:先是喜欢地要死,然后是恨地要死,现在的又爱又恨,爱的是这个语言,恨的是很多不合格的人在滥用和凌辱它。

C++的未来

C++语言发展大概可以分为三个阶段(摘自Wikipedia):

  • 第一阶段从80年代到1995年。这一阶段C++语言基本上是传统类型上的面向对象语言,并且凭借著接近C语言的效率,在工业界使用的开发语言中占据了相当大份额;
  • 第二阶段从1995年到2000年,这一阶段由于标准模板库(STL)和后来的Boost等程式库的出现,泛型程式设计在C++中占据了越来越多的比重性。当然,同时由于Java、C#等语言的出现和硬件价格的大规模下降,C++受到了一定的冲击;
  • 第三阶段从2000年至今,由于以Loki、MPL等程式库为代表的产生式编程和模板元编程的出现,C++出现了发展历史上又一个新的高峰,这些新技术的出现以及和原有技术的融合,使C++已经成为当今主流程式设计语言中最复杂的一员。

在《Why C++? 王者归来》中说了 ,性能主要就是要省电,省电就是省钱,在数据中心还不明显,在手机上就更明显了,这就是为什么Android 支持C++的原因。所以,在NB的电池或是能源出现之前,如果你需要注重程序的运行性能和开发效率,并更关注程序的运性能,那么,应该首选 C++。这就是iOS开发也支持C++的原因。

今天的C++11中不但有更多更不错的东西,而且,还填了更多原来C++的坑。(参看:C++11 WikiC++ 11的主要特性

 

总结

  • C++并不完美,但学C++必然让你受益无穷。
  • 是那些不合格的、想对编程速成的程序员让C++变得坑多。

最后,非常感谢能和“@简悦云风”,“@淘宝诸霸”,“@Laruence”一起讨论这个问题!无论你们的观点怎么样,我都和你们“在一起”,嘿嘿嘿……

(全文完)

(转载本站文章请注明作者和出处 酷 壳 – CoolShell ,请勿用于任何商业用途)

好烂啊有点差凑合看看还不错很精彩 (51 人打了分,平均分: 4.41 )
Loading...

C++的坑真的多吗?》的相关评论

  1. mike :
    @xiaoyu
    如同博文所说,C++有500%的特性,C和Java加起来还多。若会了C++,Java,C很简单
    工作的人别称自己新手,新手有的是时间学

    这个倒是的。 比C 和 JAVA加起来的要多多了。。 完全赞同 . 其实没办法。 某些软件是C++开发的。 没办法不熟悉, 要去看, 分析软件的行为。 唉。

  2. 你所列的C++对C的优化,完全同意。但是为此引入了更多的语法。使语言显得更加复杂。C++兼容C的结果,一方面可以兼容旧代码,另方面两种风格的代码混在一块,显得很丑陋。Java对C++优化,我个人感觉更好,因为优化之后语言显得更加简单了。

  3. 我们是不是过于苛求了?C也好C++也好它们是一种语言,什么是语言,语言就是用来沟通的工具。如果我们可以用它来表达我们绝大多数的思想,不会由于找不到合适的字眼而说不出想法,那它就是一门好语言。至于你用它来骂人还是赞美人,或者无目的的胡言乱语,关语言本身什么事?难道语言的设计者还要规定你先说哪个字后说哪个字,哪个字不能说?你们是不是当奴隶当习惯了?

  4. @YY
    YY在49楼讲的故事简直太好了, 抱着c而不思变同时对c++充满敌意的c程序员,绝对是c++坑多这一言论的最大来源

  5. YY :
    C++在国内外备受非议已经有很多年历史,国内以游戏界编程偶像云风的某篇博文为首,掀起了轰轰烈烈的反C++复C运动,国外则以Linus的一篇牛粪开头的帖子为起点重燃战火。

    Linux是什么?就是山寨版的UNIX,照着UNIX的样子重新实现了一遍而已。既然是山寨,当然是把UNIX的实现语言也原样照搬最好,这样山寨才省事嘛。不然用的话,用C++,linus们还得动脑子创新。为什么GNU自己的内核一直搞不定,就是因为放弃了山寨之路要搞创新,结果被Linux钻了空子。

  6. C的坑不比C++多。
    但C的坑的密度真比C++大。

    要说“C++的坑真的不多”,对不起,实话实说,我只能认为……太幼稚了。
    比如说这篇文章提到的优点的背后:
    ·用namespace解决了很C函数重名的问题。
    ↑顺便给name mangling插了一脚。
    ·用const/inline/template代替了宏,解决了C语言中宏的各种坑。
    ↑不确切。作为一种能对标识符进行无副作用操作的语言特性,很多场合宏是替代不了的。
    ·用引用代替指针,解决了C语言中指针的各种坑。这个在Java里得到彻底地体现。
    ↑很多时候只是要禁止nullable,引用反而容易引起新手的混淆。而Java的引用说好听了是折中说难听了是退化,反而nullable+modifiable了,比起引用更接近于指针。(所有这些东西的共同点是禁止了指针算术。)
    ·用强类型检查和四种转型,解决了C语言中乱转型的各种坑。
    ↑这个也是有问题的。需要基本兼容C的nominal类型系统,没有type classes等明确限制特定类型行为的手段,静态检查再强也有限。更不用说Overloading resolution上面一堆transform category和附带的细节的坑上加坑了。
    ·用函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西。
    ↑同上,不允许用户自定义规则的重载真是坑得逆天了。(读一下ISO C++ Clause 13就知道了,某种意义上比模版还麻烦。)并且坑爹的name mangling造成了现实应用中的最大的问题:ABI不兼容。
    ·用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题。
    ↑但也很容易让经验不足者写出鸡肋代码。
    ·用RAII,智能指针的方式,解决了C语言中因为出现需要释放资源的那些非常ugly的代码的问题。
    ↑这点实用上不错,但对象的语义上还是有些问题。——我只需要“生存期”的控制,为什么会扯上“存储”?
    ·用OO和GP解决各种C语言中用函数指针,对指针乱转型,及一大砣if-else搞出来的ugly的泛型。
    ↑根本而言还是C的渣渣类型系统惹的祸。要说“解决”……还是省省吧。
    ·用STL解决了C语言中算法和数据结构的N多种坑。
    ↑代码少了不少,但算上类型系统的倒贴,其实也没少多少坑。比如,为什么SCARY iterator还要拖到C++1y呢。

    C++的确并不适合初级程序员使用,其实C也差不了多少。
    汽车还是算了吧……C是飞机,C++是空天飞机。

    1. @幻の上帝:

      要找问题当然可以找得到,任何事情我都可以挑出毛病来,呵呵。你的很多回复就是在扯别的东西,比如:
      1)我说“const/inline/template填了c语言中的坑”,你却和我说“很多场合宏是替代不了的”。
      2)我说“引用代替指针,解决了C语言中指针的各种坑”,你却和我说“禁止nullable”。
      3)我说“强类型检查填了坑”,你说“静态检查再强也有限”。
      4)我说“函数重载、函数默认参数,解决了C中扩展一个函数搞出来像func2()之类的ugly的东西”,你说“不允许用户自定义规则的重载真是坑得逆天了”。
      5)我说“用继承多态和RTTI解决了C中乱转struct指针和使用函数指针的诸多让代码ugly的问题”,你说“很容易让经验不足者写出鸡肋代码”。
      6)我说“用RAII,智能指针的方式不错”,你说:“语义上有问题”

      我说东,你说西;我说宏有问题,你说宏不能全部取代;我说实用,你说语义;我说功能,你却说经验不足的人……,大哥,“经验不足的人”也能成为你的论资?对于经验不足的人来说,和技术就没关系了,你是在偷换概念。

      实话实说,你这不是“幼稚”,你这是“沟通障碍”!

  7. 下面是婊Java时间:
    ·Java彻底废弃了指针(指针这个东西,绝对让这个社会有几百亿的损失),使用引用。
    ↑也自绝于底层抽象。
    ·Java用GC解决了C++的各种内存问题的诟病,当然也带来了GC的问题,不过功大于过。
    ↑实用上来说很难用“功大于过”一言以蔽之。另外别忘了C++也可以有GC,尽管不是标配。C++11至少在概念上已经给跨平台的GC扫清了障碍。
    ·Java对异常的支持比C++更严格,让编程更方便了。
    ↑不止我一个人认为checked exception是程序语言设计史中最愚蠢的发明之一。似乎只此一家,别无分店。至于exception specification,C++是画虎类犬了,另当别论。
    ·Java没有像C++那样的template/macro/函数对象/操作符重载,泛型太晦涩,用OO更容易一些。
    ↑拿个type erasure的语法糖居然好意思称为泛型。
    ·Java改进了C++的构造、析构、拷贝构造、赋值。
    ↑改造→阉割。去除了值语义和确定性的对象生存期的终止,这些就自然没了。
    ·Java对完全抛弃了C/C++这种面向过程的编程方式,并废弃了多重继承,更OO(如:用接口来代替多重继承)
    ↑自作多情。mixin就要折腾得手酸是闹哪样?
    ·Java比较彻底地解决了C/C++自称多年的跨平台技术。
    ↑二进制部署罢了。混淆也不比二进制文件好用。即便不考虑潜在的“一次编译,到处调试”,实际上还是C更跨平台。
    ·Java的反射机制把这个语言提升了一个高度,在这个上面可以构建各种高级用法。
    ↑C/C++这点的确是硬伤。虽然不至于是鸡肋,但还是没鸭子好用。
    ·C/C++没有一些比较好的类库,比如UI,线程 ,I/O,字符串处理等。(C++0x补充了一些)
    ↑许多领域不是没有而是太多了,导致没法随便拣一个塞进去当成标准库。

  8. YY :

    Marvin :C++不应该得到赞美,因为它没有完成的它的历史定位。面向对象+组件平台,都完成的一塌糊涂。而需要Java,.Net这类货色充当历史舞台。而面对性能问题,又会回来到C上来解决。C的问题很明显,但这么多年来还不能退休就是因为C++不能接班。所以你们不觉得这个情况很尴尬吗?

    历史定位?请问这个历史定位是你定的吗?C++不能接C的班的地方多了去了,C++使用模板等特性以后很难确保获得安全的能在内核态运行的代码…

    你要说异常还好理解点。模版……不会显式实例化?

  9. Matrix :

    haitao :
    @Matrix
    那当然是理想情况,是一个语言的最高目标。
    但是,如果把人、项目都分级,针对不同水平的人和不同难度项目的各种组合,看看语言是不是坑,
    统计一下(如果加权不同水平的人和不同难度项目的百分百,就更准了),就知道这个语言的好坏程度了

    你的比喻本身就不恰当,OA,流程管理系统,这些是什么?是应用,应用是谁写的?是程序员用某种语言写的,所有应用的操作都是在程序员设计好的逻辑框架下的,否则就是BUG,明白吗?除非是像生化危机里邪恶的实验室某些特殊要求,程序才会设计自毁功能,否则用户只能按照应用的说明书来操作。
    那么再说下语言的本质,语言的本质是告诉CPU该干啥,你再高级的语言,到最后翻译成的CPU指令都是差不多的(在干相同的事的前提下,当然了,某些语言生成的冗余指令会更多),CPU是不知道吃饭要先张嘴的,所以越底层的语言越容易犯错,不是坑太多,而是太自由!而越高级的语言对底层的细节封装的就越隐蔽,程序员基本无法控制,当然绝大多数无需控制,可取所需而已!
    如果你非要把自己限制在一个框架下,完全按照说明书去办事,随便找个人培训下就好了,这也可以解释,为什么街上都是JAVA,.NET等培训班,而很少见C培训班,所以你例举的例子根本不对!

    错。CPU该干啥?GPU就不行了么233。
    另外举个例子。f(i, i++);——C/C++没有直接告诉CPU什么的该干啥,反倒给了实现任意选择先对i再对i++或先对i++后对i求值的自由(——因为都是i所以就杯具了,但在其它的某些场合,的确比起Java之流而言是优势)。
    以为能发挥底层能力就会抛弃上层抽象的,不适合C/C++。

  10. @YY

    YY :

    boywhp :明显C更适合大型项目吧,至少操作系统内核代码目前还没有C++的@vincent

    你根本不知道内核代码为什么不首先选择C++来编写的原因,跟大项目不大项目无关,内核苛刻的运行环境,现在的C++实现还缺乏对其完善的支持——主要变现在很多高级特性产生的代码可能带来的内存分页问题,而C作为一种高级汇编在这种需要精确控制硬件资源…严格的来说,只要用C89能做的事情,C++都行,All Valid C Program is Valid C++ Program.

    严格来说,“只要用C89能做的事情,C++都行,All Valid C Program is Valid C++ Program.”就是错的。要反例很简单,参见ISO C++ Annex C。

  11. @YY
    (不想折腾引用了……)
    >Dave,Andrei,Herb,Bjarne,随便是谁设计的,这都不是个好主意。请不要动不动抬出权威来吓人。[]语法是C++11为引入lambda特性而设计的。C++11的lambda是帮助程序员快速生成函数对象类定义的语法糖。换言之,此处这个你认为极妙的设计,看起来很美,但是带来的结果是什么?一个函数对象类的定义!老天,我们需要的是一个全局函数,你却给了我一个叫不出名字来的类定义!是的,你可以改造编译器,让它在此处做一些小动作,强行在这里生成一个函数——等等,怎么这个函数的参数没有类型,你说这里想要的是一个函数模板?对不起,C++11还不支持lambda模板…——是的,你可以继续hack编译器,直到得到你想要的结果,以及一份完全缺乏自洽,让人惊奇不断地,自相冲突的C++标准,啊哈,太好了,C++又有可以让你喷的地方了。
    ↑麻烦拿出关于你的论点的论据:
    1.不是个好主意。不自洽?不协调?不实用?过于复杂?
    2.改造编译器。为什么不会是语言的演进?
    3.一份完全缺乏自洽,让人惊奇不断地,自相冲突的C++标准。缺乏哪里的自洽?哪里自相冲突?
    >除了Brainfxxk,我不知道有什么语言的设计者出发点是不好的,模板本来就不是为了进行静态的函数式编程而设计的,刚好能被用来进行元编程只是一个美丽的巧合,拿一个“意外”和专门为函数式编程而设计的“故意”去比,实在是太有节操了。你说模板语法奇特?模板作为模板使用语法一点都不奇特,那只是你硬要用模板来做元编程罢了,实际上即使用模板做元编程,也不会别其它函数式语言奇特到哪里去。你希望的变量赋值,那是一个运行时副作用,你知道模板写成的元程序是什么时候运行吗?实际上赋值是存在的,只是你根本没明白模板元编程罢了。
    ↑什么语言设计的出发点是不好的?我记得Brainfxxk的设计目标也不是fxxk,而是为了演示某种简单的状态机的语言实现。另外类似的如草尼马语言。
    不爽C++模版语法的恐怕写编译器的比较多点。至少得让用户来关心>>的破事怎么看都是个不怎么样的设计。
    >STL特指标准中Container Library,Iterator Library,Algorithm Library三章中涉及的部分
    ↑拿出【可查证的】【权威】出处,说明这个说法是公认的。SGI STL是STL不?

    婊Java倒是说得不错。

  12. @陈皓
    你只是笼统地说“填了”。我说没填够或制造了其它的坑,总体上坑的状况没变好多少。——光从这里涉及的数量上来说,坑就不见得有变少。
    只注意到你说的填坑的新手,若完全不知道为了坑的确切范围和填坑付出的代价,搞不好又被坑一把。

    1. 我举的这些例子,经典的不能再经典了,“笼统”个啥啊。你的那些回答包括现在的回答才叫“笼统”,也没有证明C++的坑比C多。

      希望你认认真真写篇文章,从实践出发,少说“语义啊”,“经验不足啊”,“原理上啊”这些东西,把C++比C坑多的地方列出来,让大家评一评。

      另,我这篇文章的观点不是“C++的坑多还是少?”,我这篇文章的观点是让大家学会“理性地思考”并“研究技术或语言的变迁”! 谢谢!

  13. EffC++的风格我顺便试试好了……

    条款:慎用下划线作为标识符。

    原理:
    按 ISO C++03 17.4.3.1.2/ISO C++11 17.6.4.3.2 Global Names [lib.global.names] 规定,以下名称保留给(核心语言和标准库)实现使用:
    包含连续双下划线 “__” 或以下划线 “_” 紧接大写字母起始的名称;
    在全局命名空间和 ::std 命名空间内以下划线 “_” 起始的名称。
    (PS.其实ISO C也有第一条,但是下面的例子是C++特有的。)

    反面的例子(以下来自[email protected]):
    msvc
    __declspec(dllexport) void f(void) {}
    __declspec(dllexport) void _imp__f(void) {}
    编译为dll会导致编译器崩掉。
    因为”symbol”会产生两个符号:”symbol”与”_imp__symbol”。
    f产生的_imp__f与_imp__f产生的_imp__f冲突了。
    叫你用前缀下划线,叫你用双下划线

  14. 幻の上帝 :
    EffC++的风格我顺便试试好了……
    条款:慎用下划线作为标识符。
    原理:
    按 ISO C++03 17.4.3.1.2/ISO C++11 17.6.4.3.2 Global Names [lib.global.names] 规定,以下名称保留给(核心语言和标准库)实现使用:
    包含连续双下划线 “__” 或以下划线 “_” 紧接大写字母起始的名称;
    在全局命名空间和 ::std 命名空间内以下划线 “_” 起始的名称。
    (PS.其实ISO C也有第一条,但是下面的例子是C++特有的。)
    反面的例子(以下来自[email protected]):
    msvc
    __declspec(dllexport) void f(void) {}
    __declspec(dllexport) void _imp__f(void) {}
    编译为dll会导致编译器崩掉。
    因为”symbol”会产生两个符号:”symbol”与”_imp__symbol”。
    f产生的_imp__f与_imp__f产生的_imp__f冲突了。
    叫你用前缀下划线,叫你用双下划线

    (好吧我错了,纯C看来也可以这样折腾出错……)

  15. 有争论很不错,但要良性争论,不要以攻击为目的。
    我对面向对象的原理了解,但说实话,对C++的应用,包括java的应用却不熟练。甚至怕用C++。
    我觉得C也挺好,大型的,小型的,都行,语言之争,唉唉,太多了,有点无聊的话题。
    管他啥兵器呢,能高效快速地干掉敌人就行。
    一个开源的软件交换系统,纯粹用C语言写的,也挺好的啊。大家可以去看看这篇文章的分析:
    开源软交换系统 :<>
    http://ityait.com/forum.php?mod=viewthread&tid=540&extra=page%3D1

  16. 语言的学习和开发的动力主要有两个:应用或兴趣。兴趣的话,就是愉悦自己;但使用就是比较麻烦了。很多人整天在讲语言的问题,而忽略了语言的使用环境问题,这才是真正麻烦的由来吧。语言从来没有什么优劣来讲,因为它们都会找到契合它们的使用环境。

  17. duyanning :

    YY :
    C++在国内外备受非议已经有很多年历史,国内以游戏界编程偶像云风的某篇博文为首,掀起了轰轰烈烈的反C++复C运动,国外则以Linus的一篇牛粪开头的帖子为起点重燃战火。

    Linux是什么?就是山寨版的UNIX,照着UNIX的样子重新实现了一遍而已。既然是山寨,当然是把UNIX的实现语言也原样照搬最好,这样山寨才省事嘛。不然用的话,用C++,linus们还得动脑子创新。为什么GNU自己的内核一直搞不定,就是因为放弃了山寨之路要搞创新,结果被Linux钻了空子。

    别出来丢人了,回去吧,如果你真懂linux你就不会这么说,还用C++linus还得动脑子创新,你SB了,语言只是一种工具,c能实现,C++怎么不能实现?linux只是一山寨那为什么高纳德不用unix而说linux是他的最爱,无知不可怕,可怕的是不知道自己无知,一个不会linux的c或c++程序员也不感觉丢人

  18. lowcost :
    突然想知道好奇号是用哪种语言搞的 ^ ^

    ————————————————————
    必须c语言,好奇号的操作系统是vxworks,肯定是c写的,运行的程序也是http://news.cnblogs.com/n/153089/

  19. rimbaud :

    lowcost :
    突然想知道好奇号是用哪种语言搞的 ^ ^

    ————————————————————
    必须c语言,好奇号的操作系统是vxworks,肯定是c写的,运行的程序也是http://news.cnblogs.com/n/153089/

    万一是用android写的,你会不会吐血?

  20. 赞成博主的观点 喜欢C++ 但不喜欢C++被别人误用或滥用 对C++使用多年的感觉 每个阶段都会发现之前自己理解中的局限 C++是一本越读越厚的书其中妙思值得细细品味

  21. 有一句话说的很好:“别拿螺丝刀当锤子”。编程语言的选择也是一样,C和C++也有不同的应用场景,对于嵌入式开发等和硬件打交道的项目,C是很适合的,这种项目一般和硬件直接相关,基本不需要做什么抽象,按照硬件文档实现功能逻辑就完了,除了嵌入式,一些功能性的软件的核心模块比如数据库等也适合。但是像网络游戏服务器这种项目,几十万上百万行的代码,用C语言写估计要疯掉,没有C++的OO抽象封装机制很难在进度要求内实现。
    C和C++的不同关键还是在于用的人习惯哪一种编码风格,反正我是基本没有看到过写的漂亮的C++代码,很多都是拿着C++写C代码。这可能也是为什么有人说C++坑多的一个原因吧:反正都是写C代码,C++的那些OO泛型特性又不怎么用,何必拿来自扰呢?

  22. When you work each day under [url=http://cheapnikenz-store.webs.com]Nike NZ[/url] the shadow of this short term mindset you end up under-utilizing (if not, wasting) your best asset – leverage! As you step into your CEO shoes you need to recognize where your strengths are, where your weaknesses are and how to approach them for the ultimate success of your business – and your own personal development.
    Tags: winter jackets india, buy winter clothingRejoice Your Parties With [url=http://fornikeaustralia01.webs.com]Nike Australia[/url] Glorious Fashion Styles Online By: Adanan Khan | Mar 29th 2013 – This article is about party dresses and footwear, presented by online fashion stores and providing great alternatives to shoppers. No one can think of a life without style and beautiful dresses.
    The shoes in Stuart Weitzman’s collection are sophisticated, stylish, modern [url=http://fornikeaustralia01.webs.com]Nike Shoes Australia[/url] and most importantly comfortable! The one downside to this collection is the price tag; the regular retail price of these shoes average around $300 but a true fashionista knows how to hunt down great deals at discounted rates! Websites like Myglassslipper, Zappos and Endless often have a good selection of his shoes on sale. The closest retail outlet to Newark is the Nordstrom store located inside the mall at Short Hills.
    We display you the Air Jordan Shoes, with the color styles that comes from Air Jordan 1. Peter Moore creates its design that is released firstly in March of 1985. The high leather of the shoe was sheltered in the appearance with red trait and its white become the important in the toe cap, the outsole, the exterior of the heel with a black ‘Swoosh’ logo what is fascinated and extruding the prominent status of the shoe. What’s more, most [url=http://cheapnikenz-store.webs.com]Nike Shoes NZ[/url] of the originals were the extend. Look Cautiously you will discover that you fall in love with it. Please check your approbation.
    Many features of the Skate Shoe are designed specifically to increase durability. The retro trainers often undergo harshness from the skateboard’s grip tape when worn by skaters. As a result, skaters are continually needing new shoes. Attention to the type of material used (suede, leather, plastic undercoating) and the strategic placement of these materials (exterior, toe cap) help increase the life of retro trainers. Other features such as protectors and lace loops are created to keep laces from shredding by protecting the areas that come in contact with grip tape.
    Owner IQ dives further into product ownership by pinpointing consumer interests across multiple categories. The company points out that products are a reflection of our interest, values, and group affiliations. Cultures and subcultures are defined by one brand or a group of brands. When I purchase a New Balance shoe from Amazon my interest is cataloged and transferred to similar categories. My new running shoe might mean I a runner looking to buy reflectors, ear muffs, running spandex, and more New Balance products. Along with running products, I may be a promising target for similar sports products like water bottles, etc.

    [url=http://www.viporno.ru/user/Wendyxnm/]Finding Convenient Programs In cheap shoes[/url]
    [url=http://gulaydinn.com/forum/index.php?action=profile;u=64501]No-Hassle Methods For cheap shoes[/url]
    [url=http://www.bah-youth.com/forums/index.php?showtopic=689894]Finding Simple Products In cheap shoes[/url]
    [url=http://forumalatberat.com/index.php?action=profile;u=3839]Thinking About Easy Products In cheap shoes[/url]
    [url=http://9mb.ru/user/jordanzlu/]The Latest On Rapid Solutions For cheap shoes[/url]

  23. I am extremely impressed together with your writing abilities as well as with the layout to your blog. Is this a paid topic or did you modify it yourself? Either way stay up the nice quality writing, it’s uncommon to look a great weblog like this one these days..

  24. Pingback: » 对技术的态度

发表回复

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