学校里学不到的C语言教程之9C中永远

大家都知道C语言在后来的面向对象大潮中,发展出了另外一个很争议的语言,那就是万千高低手们追捧的C++。长期以来C++号称无所不能,如果不能那一定是使用者无能......好了调侃完C++我们来看看当时代发展到gui之后的一些变化。这种变化当然是windows带来的,传统的C语言就像今天的linux一样都是命令行的天下。写起程序来也是简单,大多数情况下一个过程了事,大不了再分成几个小线程。但在windows出现后,事件驱动的代码出现了,在gui界面上发生一件事后会立即要求执行操作,这时候就产生了一个新的概念--事件,据说事件和很早以前的中断处理很相似,不管怎么样,这在C语言里实现易如反掌。只要把事件中要发生的事情写成一个函数,然后把函数的指针告诉事件的调用者就可以了。但在C++中,这做不到,如果把类成员函数的指针传递过去的话,那么在调用的时候,事件函数中一旦调用到this相关的东西程序就会立即出错!

据说这种情况是因为C++的类无法处理this在函数传递时的正确性......如果您想深入点原因的话,那么还有很多很多的文章等待着要去给这个C++解决不了的问题进行辩护。但是尴尬的是不是所有的C++都不能传递类成员作为事件函数,因为很明显BCB就是可以的......当然了卫道者们会跳出来指责BCB不标准,可惜他们解释不了,为什么bcb能实现。其实这没什么希奇的,之所以bcb外的大多数C++实现做不到说白了就是C++标准的顽固不化,连个容器都要搞个所谓高大上的STL的语言能生出什么妖蛾子一点也不希奇,我们老油条早就习惯了。这不C语言的两位创始人在又一次C++的新特性介绍会上终于受不了了,他们俩回去后抛弃了C++另外弄了一个语言,那就是现在服务端真正的王者GO语言--golang。当然了,我并不是C++的反对者,我只是说C++标准有时候很扯蛋,而且有时候扯得厉害。

另外听说新的C++标准支持了这种特性,真假不知,反正我工作环境下的C++还不支持,所以我无论如何是不会冒险使用这个特性的。其实就算标准没有,也有第三方的模块声称实现了,这样的模块我尝试过很多,坦率地说我确实碰到过能用的,但是显然我是不敢用的。

以上就主的是C++的函数指针的趣事。说到函数指针,C语言里的是真难写。所以大多数语言都在简化事件的处理函数,比如C#中的委托,比如java中的匿名函数,匿名类等。说真的,我觉得java的做法比C++还烂,匿名类这个东西比函数指针还要难理解,直接就是反人类的产品。在ios的objectc中也是大量用了匿名函数,特别是线程处理和通讯处理中,要说的是objectc的处理其实也不好,也是本来想简化的结果反而更复杂。要说处理得好的,还是golang中的方法,不过objectc的调试器是做得真好,它确实能在出错时准确的指出来错误在哪个线程中,另外objectc的arc机制也比golang的垃圾回收要好。objectc的内存arc机制我认为是所有垃圾内存自动回收做得最好的,golang如果也有就太好了。

golang的函数指针声明非常人性化

大家可能觉得奇怪,不是C语言教程吗?怎么扯到java、golang身上来了。这是因为这些后来的语言都是针对C的缺陷面发明出来的,就算我们不用,也可以从它们的设计思想中找到更好的应用C语言的方法。不要说golang这样C语言之父反思的作品了,就是大多数程序员瞧不上的php,它的处理很多思想也是非常精妙的,象它的内存处理,方法非常巧妙和nginx非常的相似,大家有时候可以读一读php5左右版本的代码,那都是写得非常好的纯C语言,绝对不是大家应该瞧不起的对象!

好了,以上就是关于C++的函数指针的故事。我最想说明的是C++并不是无所不能的,因为很多C++程序员都有这种想法所以真的应该指出一下。这个问题就是C++里曾经非常著名,又非常长时间里没有解决的问题,基本上折射出了C++的问题。C++真的没有你们想象的那么了不起,所有语言都应该只是我们解决问题的工具而已,它不宗教也不是鄙视链条上的一环。




转载请注明:http://www.aierlanlan.com/rzdk/1120.html

  • 上一篇文章:
  •   
  • 下一篇文章: