Linux作为GNU家族的一员,其源代码数以万计,而在阅读这些源代码时会发现,不同
源代码的美观程度和编程风格都不尽相同,有些代码看起来令人赏心悦目,而其他有
些程序员写的程序则让人看起来直皱眉头。写出干净美观的代码,不仅仅使得代码更
容易阅读,还使得代码能够成为一件艺术品。Linux有两个编程风格:GUN风格和Linux
核心风格。
GNU风格
1)函数返回类型书名和函数名分两行放置,函数起始字符和函数开头左花括号放到最
左边:
static char*
main(argc,argv)
int argc;
char*argv[]
{
......
}
或者用标准C:
static char*
main(int argc,char*argv[])
{
......
}
如果参数太长不能放到一行,清在每行参数开头出对齐:
int
net_connect(struct sockaddr_in*cs,char*server,unsigned short int port,
char*sourceip,unsigned short int sourceport,int sec)
对于函数体,应该按照在如下方式排版:在左括号之间、逗号之后,以及运算前后
添加空格是程序便于阅读:
if(x<foo(y,z)))
haha = bar[4]+5;
else
{
while(z)
{
haha+=foo(z,z);
z--;
}
return ++x+bar();
}
当一个表达式需要分成多行书写时,应该在操作符之前(而不是之后)分割。例如:
if(foo_this_is_long&&bar>win(x,y,z)
&&remaining_condition)
2)尽量不要让两个不同优先级的操作符出现在相同的对齐方式中,应该附加额外的括号
使得代码缩进可以表示出嵌套。
错误的对齐:
mode=(inmode[j]==VOIDmode
||GET_MODE_SIZE(outmode[j])>GET_MODE_SIZE(inmode[j])
outmode[j]:inmode[j]);
正确的对齐:
mode=((inmode[j]==VOIDmode
||(GET_MODE_SIZE(outmod[j])>GET_MODE_SIZE(inmode[j])))
outmode[j]:inmode[j]);
3)按照如下方式排版do_while语句:
do
{
a = foo(a);
}
while(a > 0);
4)每个程序都应该以一段简短地说明其功能的注释开头:
/*fmt-filter for simple filling of text*/
5)请为每个函数书写注释,说明函数是做什么的,需要那些入口参数,参数可能值的
含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何
可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。
6)不要声明多个变量时,跨行,每一行都已一个新的声明开头
错误的声明:
int foo,
bar;
正确的声明:
int foo,bar;
或者
int foo;
int bar;
如果是全局变量,在每一个变量定义之前都应该注释。
7)当一个if中嵌套了另一个if-else时,应用花括号把if-else括起来:
不要写:
if(foo)
if(bar)
win();
else
lose();
而要写:
if(foo)
{
if(bar)
win();
else
lose();
}
8)要在同一个声明中同时书名结构标识和变量或者结构表示和类型定义
(typedef)先定义变量,在使用。
9)尽量避免在if条件中进行赋值:
if((foo=(char*)malloc(sizeof*foo)==0))
fatal("virtual memory exhausted");
而要写:
foo=(char*)malloc(sizeof*foo);
if(foo==0)
{
fatal("vrtual memory exhausted"); }
10)请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏
和枚举常量,以及根据统一惯例使用的前缀。
11)用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后
而不是选项字符之后被命名。一条注释即应该说明选项的精确含义,
有应该说明选项的字母:
/*ignore changes in horizontal whitespace(-b)*/
int ignoe_space_change_flag;
Linux内核编程风格
1)Linux内核缩进风格是8个字符。
2)Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束
大括号放在一行的第一位:
if(x==1){
......
}
命名函数时,开始的括号放在下一行的第一位:
int function(int x)
{
......
}
结束的括号在他所占的那一行是空的,除了它还可以跟随着同一条语句的
继续符号如while在do-while循环,或者else在if语句中。
do{
......
}while(condition);
以及:
if(x==y){
......
}else if(x>y){
......
}else{
......
}
3)命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。
应该命名为tmp,这样容易书写,也不难理解。但是命名全局变量就应该用描述
性命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免
过长。
4)函数最好短小精悍,一般来说,不要让函数的参数多于10个,否则应该尝试分解
这个过于复杂的函数。
5)通常情况,注释说明代码的功能,而不是其实现原理。避免把注释插到函数体内,
而应写到函数前面,说明其功能,如果这个函数的确很复杂,其中需要有部分注
释可以写些简短的注释来说明那些重要的部分,但是不能过多。
如果感觉这些规则过于复杂,有一个小工具可以帮助你——indent。
例如要把代码转换到GNU或Linux核心风格,可以分别使用:
indent -gnu test.c
indent -kr -i8 test.c
|
|