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 完成多大的项目。

评论