学习华为C/C++编程规范(最新版)的一点心得体会

  • 缘起
  • 深入
  • 华为的进击
  • 我的感受
    • 全面
    • 务实
    • 高效
  • 后续

缘起

第一次接触编程规范,是在我十多年前刚参加工作的第一家公司,虽然规模不大,只有十几个程序员,但是大家终于无法忍受每个人个性化的代码书写方式, 最终讨论制订了一份C++编程规范,很简单,只有几页Word文档,主要是变量命名/格式对齐之类的一些代码可读性方面的约定。
当时对编程规范的印象就是为了统一代码风格,这当然是很肤浅的。

深入

直到后来遇到Google的C++编程规范,发现涉及的面非常广,从头文件包含,到异常使用,到变量命名,几乎涉及到了C++语言的方方面面。
我这才发现编程规范的重要性,感觉学会编程语言只是第一步,不掌握好的编程规范的话,很难写出好的代码。
就好像开车一样,只要会挂挡/打方向/踩油门/踩刹车就算会开车了,但是这样开车出去很容易出事故,还必须学习交通规范/交通礼仪,才是一个合格的好司机,才能一直快快乐乐安全的开车。
编程规范就是保证大家安全编程的交通法规。

华为的进击

华为可以说是目前国内使用C++语言最多的公司,因为其所处的通信行业,一向对运行效率要求非常高,C++就成为当仁不让的选择。
华为第一次制定公司级的C++编程规范大概是在2011年,主要内容是参考了 《Google C++ Style Guide》
几年过去了,C++语言经过了几次大的修订,尤其是C++11,引入几十个新的feature,使C++语言的表达能力提升了一个台阶,当然,复杂度也提高了。
最近,我有机会学习了华为新颁布的C++编程规范,相对老版有了巨大的提高,主要是体现了C++11之后语言的发展,同时对老的不合理的规定做了修改。

我的感受

学习了之后,最大的感受就是这是一个非常全面,非常务实的编程规范,如果认真执行,带来的好处将是巨大的。

全面

首先是全面,全文一百多页,跟Google编程规范类似,规范了从头文件包含到变量命名的所有细节,甚至还就面向对象的设计原则做了一些讨论。

务实

其次是务实,虽然规定了很多的原则建议,但是几乎每个规定都可以有例外,并不是僵化的一刀切。这其实就是一种非常务实的态度,华为这么大的公司,所涉及的项目数以千计,一刀切只会导致僵化的执行。
印象较深的几点:

  • 变量命名
    推荐采用驼峰式命名,但是如果项目所处的环境不同,也可以入乡随俗,比如使用MFC的项目可以用匈牙利命名,涉及Linux核心的代码则可遵循Linux的命名方式。
  • 魔鬼数字:
    很多编程规范都禁止使用魔鬼数字,僵化的执行导致了很多笑话,例如有人直接把数字定义为宏
	#define ONE_THOUSAND 1000

这显然不能提高代码的可阅读性,新版的华为规范就规定了,对于出现次数少的数字,在使用的地方加注释即可,对于多次使用的数字,建议定义常量并加注释。

  • goto
    不知道从什么时候开始,goto变成了万恶之首,几乎所有的C++编程规范都明令禁止使用goto,其实goto如果使用得当的话,会写出高效优美的代码。
    好在华为意识到了这点,新版的规范就规定了可以在“函数单一退出点”使用goto,也算是为goto正了一次名。
  • 函数头注释
    很多规范都要求函数头必须写注释,而且规定了具体的格式,实际中,有很多简单的函数,一眼就能看出用法,也必须写十几行的格式话注释,最后导致头文件非常冗长。
    华为新版规范就规定了,对于函数名能够自解释的,可以不写注释。

高效

另外一点印象是高效,华为作为一家通信设备制造商,用C++所写的软件大部分都运行在对效率要求非常高的通信网络设备上,因此华为的软件的效率一直放在很重要的位置,新版的编程规范也体现了这一点,例如:

  • 函数入参检查
    我参加过很多的项目,几乎所有的项目都要求函数要对入参进行有效性检查,这其实是很大的浪费,既降低了程序的可读性,又降低了运行性能,在一个大型程序中,调用栈经常有几十层,而很多的重要对象,往往从底层一直传递到顶层,每一层调用都进行一次指针检查,非常多余。
    有些大的函数有十几个参数,每个都检查一遍就几十行代码了,导致代码重复/冗余/丑陋/低效。
    但是这似乎又是必须的,不检查参数怎么可以呢,出事了谁负责?

    好在,华为做出了有益的探索,新的C++编程规范规定,由调用者保证函数入参的合法性,这样就只需要在生成指针的地方做一次检查,后续传递参数就不用做检查了,大大节省代码量。而并没有降低代码的可靠性,因为规范同时禁止对指针参数进行偏移操作,所以只有在生成指针时检查一次,后续就无须检查了。

后续

以上是我对华为C++编程规范的一点自己的感受,欢迎大家指正。
还在继续研读华为C++编程规范以及别家的规范,尤其是Google和微软的,到时候再做一次比较。

更多推荐

学习华为C/C++编程规范(最新版)的一点心得体会