实际上之前有和程序员朋友讨论过一些程序风格的问题,对于程序风格的话,我一般不会刻意要求别人,因为程序风格这个东西,就像写字,有些人用宋体,有些人用楷体,你没办法说宋体不好或者楷体不好,只要能容易辨认,都是好字。然而,发散到程序风格这件事上面来,有些问题就凸现了。

一般来说,程序风格必须遵守如下几个要求:
1.容易辨认
2.简洁,统一
3.错开重名
4.有层次感
5.便于修改
6.小细节(函数申明位置,头文件意义,优先级处理)
关于程序逻辑我们就不讨论了,就像有人写得一手好字,却写不出好文章,今天我们只单纯讨论程序风格方面的问题。

很多朋友,在写程序的时候,只图自己痛快,想怎么写就怎么写,然而随着本领的增强以及工作的变迁,很多时候,我们都不得不面对一个问题,就是多人维护一份代码。所以,一个有远见有抱负的程序员,写程序的风格,必须遵守上述要求。

首先来说第一点,为了让程序容易辨认,我们必须有一套自己的命名规则,我个人比较推崇的命名规则如下:
1.函数名和变量名用头字母大写来区分,比如GetFilePath()这个命名,我们能一看函数名,就知道这个函数的功用。
2.全局变量和指针等特殊意义的变量名前,加小写前缀,如gCount表示一个计数全局变量,pTime表示一个指针,如gpNum表示一个全局指针。
3.宏、枚举值和自定义类型用带下划线间隔的全大写,如#define MAX_BUF_SIZE 8,定义了一个宏,如
typedef struct{
    int Day;
    int Hour;
    int Min;
}TIME_RECORD;

定义了一个结构体。
有了好的命名规则,人家看你程序的第一感觉,就会觉得很亲切,才有耐心继续读下去。当然,如果你不希望自己的程序被别人读懂,你也可以将所有变量及函数用简单的abcd命名,会大大增加阅读难度。
另外,在写语法的时候,也有一些小技巧。大家知道,if和switch是可以互相替换的。有些时候,程序有几层分支,于是就会看到switch里面又有一个switch,case里面又有case,这很容易造成读者眼花手乱。所以建议switch里面如果要再分支,就用if代替,反之依然。这点也能增加程序的可辨认性。

再说第二点,简洁、统一。很多时候,同样的代码,可以用更少的语句来写,此谓简洁,比如x=y=z=0。一个项目或者代码模块里,类型名最好都统一,比如都用U32,U16,U8来重定义所用到的数据类型,这样会大大方便代码移植和可读性。

第三点,错开重名。这一点在编写大项目的时候是很重要的,因为如果稍不注意,你命名的函数名或者变量名就有可能和其他程序员的重名。要解决这个问题方法很简单,就是加上特征前缀,比如gui模块的函数和类型全部加上“GUI_”前缀,系统宏全部加上“__”两个下划线前缀。这个还靠习惯养成。

第四点,有层次感。很多人写程序的时候,为了让行数减少,同一屏显示的内容增多,往往采取将前括号放置在函数名同一行的位置,如下:
void Func(void){
if(...){
...
}}

这样的写法是很不好的,因为错失了层次感,我每次看到这样的程序的时候,我就很头疼,因为在你分析程序逻辑的时候,没有层次来提醒你。特别是在使用类似于SourceInsight这样的代码编辑工具的时候,如此写法的代码也很容易增加编辑错误的可能性,比如让你不小心多删一个括号之类的。
比较推荐的写法是前括号和后括号一定要另起一行,其同一行后面可以跟语句,视情况而定,但是它自己一定要重起一行来写。并且层次每进一层,语句都必须缩进2格或者4格:
void Func(void)
{
  if(...)
  {
    ...
  }
}

这种良好的层次感展示,会大大提高后人以及你自己阅读此份代码的效率。

第五点,便于修改。其实这一点和第四点是融合到一起的,单独提出来,增加大家的注意。举个例子,switch的case语句,一般会有一个break语句结尾,很多朋友break语句就直接跟在后面,不单独起一行。而这样的代码落到别人手里编辑的时候,如果借助编辑工具,如果要删case的代码,很容易就能按行来删除,一不小心就会把break删除了,可能连删除者本人都没注意,结果会导致程序错误。所以case里面的break最好也单独起一行。而while里面用来跳出循环的break就可以不必,因为这样的语句一般有很重要的意义,误删概率比较小。

第六点,小细节。写程序的时候,是有很多小细节的,罗列如下:
1.不要分太多的函数,也不要整篇只用一两个函数从头写到尾。要尽量将重复代码和重大意义的代码放到一个单独函数中,方便调用和阅读。
2.一个文件里面,程序一般都有子母关系,可以将子函数放前面,这样也许整个文件下来都不需要额外写函数申明。
3.要明白头文件的意义,头文件.h是给外面的模块调用的,所以本模块的局部变量和函数不要放到头文件里面申明,方便保护资源。
4.在记不清优先级的时候,多用几个括号,不要吝啬它,多加括号,不会增加额外的cpu开销。
5.注意=和==的区别,注意&和|的优先级比+-*/要低,这些错误编译器是不会报的。

我很少深读各大公司的代码规范,但是我知道它们的规范,和我的程序风格差不多,因为这些风格都是为效率和可读性可改性而产生的。以上这些,无关乎程序风格,如果你是我的学生,我会要求你按照上述规格来写代码,因为这关乎效率。而一个普通码字员和资深工程师的区别,在于此,在于你写代码的时候,是否想得更深远。你完全没必要对这篇文章死记硬背,你只需要记得,你的代码,不只是你一个人看,你的代码写得好与不好,会对其他人和以后的自己造成重大影响,那么你就会改变。长期以往,并多阅读大型成熟代码(比如酷系统的,呵呵),你会发现你的风格,和我的,和各大公司的,惊人相似。