C 有 C 的规则
最近在用 C 写程序,规模不小的程序,也谈不上太大。大约一万行之内的模块吧,关于 UI 的基础框架。我知道这个东西连用 C++ 都谈不上合适,更莫谈 C 了。可是我倔强的认为,应该用 C 把它写好。
很多人批评 C++ 没有拥有好的教育体系和方式,导致了很多 C++ 程序员在用 C 的方式写 C++ ,或是把 C++ 当成更好的 C 来用。可是受过 C++ (正确的?)教育熏陶过的程序员呢,当他拿起 C 的时候,是否把 C 当成蹩脚的 C++ 来用呢?
我希望我不是。
了解了更多的语言后,我深信,每种语言有它的游戏规则。C 有 C 的规则,C++ 有 C++ 的规则。用的越深入,越发觉得其间的差别。C++ 不是 C ,C 也不是 C++ 。它们的最大的共通点,是类似的语法,语法类似到可以用一套编译器编译。
C 没有构造函数,没有析构函数。没有虚表,没有继承。const 的使用不那么严格,强制转换不那么忌讳。没有模板,宏是强有力的工具。简单而统一的 ABI ,冗长但是有效的命名规则。
C99 以前,我们甚至不可以任意声名一个变量,这估计是最让 C++ 程序员讨厌的地方,直接违反了设计原则,但同时也让 C 程序员保持了良好且统一的风格:不会让一个函数过长,也会把函数内的模块分开,即使用蹩脚的 do {} while(0);
我曾经认为 C 在某方面比 C++ (运行时)低效,但是长时间用下来,发现正是这些“低效”,让我更小心的使用它,设计更合理的结构。
C 的潜规则里,所有数据结构的最佳默认值是 0 ,这样可以方便的使用 calloc 或者 memset 。数据结构最好是 POD ,最好减少指针的滥用,内存如果可以连续的排放在一起,那么就不惜用一些在 C++ 中看似很糟糕的方案,但这样可以方便的 free ,而且不会忘记析构。
C 做成框架中,最好减少暴露的接口,和 C++ 不同,C++ 可以一组组接口的暴露,而 C 一次只是一个 api ,这成就了无数优秀的 C 库,比 C++ 类库的使用更加便捷。但是也无形提高了设计的难度,只是 C 标准库中,就有那么些不合理的接口设计。
一不小心,我们就会用 C 把整个项目写的很糟糕,但是 C++ 不会,糟糕的项目构架很晚才会发现。而 C ,如果你设计的好,感觉就会很好,稍有不适,就需要重构了。用 C 做项目,如履薄冰。
C 就是那么一如既往的简单,简单的可爱又可恨。我用五年时间,感觉自己学会了 C++ 。但是十五年了,仍旧问自己到底可以用 C 完成多大的项目。
Comments
Posted by: 1 | (30) May 27, 2007 02:27 AM
Posted by: phus | (29) March 3, 2007 06:08 PM
Posted by: Cloud | (28) June 5, 2006 07:50 AM
Posted by: ly | (27) June 5, 2006 12:31 AM
Posted by: winsonchen | (26) May 31, 2006 07:11 PM
Posted by: Zwinger | (25) May 31, 2006 06:58 PM
Posted by: Anonymous | (24) May 31, 2006 09:30 AM
Posted by: Ninstein | (23) May 31, 2006 08:53 AM
Posted by: 卢立祎 | (22) May 30, 2006 03:33 PM
Posted by: DarkSpy | (21) May 30, 2006 03:04 PM
Posted by: analyst | (20) May 30, 2006 02:48 PM
Posted by: 卢立祎 | (19) May 30, 2006 01:31 PM
Posted by: Zenberg | (18) May 30, 2006 11:23 AM
Posted by: analyst | (17) May 29, 2006 11:21 PM
Posted by: DarkSpy | (16) May 29, 2006 09:50 PM
Posted by: 卢立祎 | (15) May 29, 2006 04:39 PM
Posted by: Corner | (14) May 29, 2006 04:35 PM
Posted by: analyst | (13) May 29, 2006 03:00 PM
Posted by: Cloud | (12) May 29, 2006 02:48 PM
Posted by: tpp | (11) May 29, 2006 02:23 PM
Posted by: 清风雨 | (10) May 29, 2006 12:22 PM
Posted by: sunway | (9) May 29, 2006 09:40 AM
Posted by: Bennie | (8) May 29, 2006 09:04 AM
Posted by: euclid | (7) May 28, 2006 10:40 AM
Posted by: myan | (6) May 27, 2006 11:55 PM
Posted by: Cloud | (5) May 27, 2006 10:39 PM
Posted by: analyst | (4) May 27, 2006 10:31 PM
Posted by: Tony Bai | (3) May 27, 2006 10:25 PM
Posted by: Bennie | (2) May 27, 2006 09:59 PM
Posted by: myan | (1) May 27, 2006 08:44 PM