18、Linux下编程风格

在前面曾总结过微软环境下编程的规范【1】,但是在linux下,没有自动补起,以及没有像VS那样高级好用的可视化开发工具,如果变量,函数定义太复杂,敲的也累,下面总结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 (outmode[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 ();

   }

如果再else中嵌套了一个if,可以这样写else if:

if (foo)

  ...

else if (bar)

...

按照与then那部分代码相同的缩进方式缩进else if的then部分代码,也可以在花括号

中像下面那样把if嵌套起来:

if (foo)

...

else

{

if (bar)

...

}

8. 要在同一个声明中同时说明结构标识和变量或者结构标识和类型定义(typedef)。单独的说明结构标识,而后用它定义变量或者定义类型。

9. 尽量避免在if的条件中进行赋值。例如,不要写:

if ((foo = (char *) malloc (sizeof *foo)) == 0)

fatal ("virtual memory exhausted");

而要写:

foo = (char *) malloc (sizeof *foo);

if (foo == 0)

fatal ("virtual memory exhausted");

10. 请在名子中使用下划线以分割单词,尽量适用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用前缀。例如,应该使用类似ignore_space_change_flag的名子;不要使用类似iCantReadThis的名子。

11. 用于表明一个命令行选项是否给出的变量应该在选项含义的说明之后,而不是选项字符之后被命名。一条注释既应该说明选项的精确含义,又应该说明选项的字母。例如:

/* ignore changes in horizontal whitespace (-b). */

int ignore_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

其他用法请使用man indent查询。

【1】http://www.cnblogs.com/mydomain/archive/2010/12/03/1895777.html

【2】 http://www.huihoo.org/gnu/c.html

上一篇:剑指Offer——从上到下打印二叉树(JS实现)


下一篇:Linux swap分区使用率高进程排查方法