函数要简短而且漂亮、并且只能完成一件事,函数的本地变量数量最好不超过 5-10 个,否则函数就有问题,需要重新构思函数,将其分为更小的函数,函数要注意的事项如下:

1、一个函数只能完成一个功能

如果一个函数实现多个功能的话将会给开发、使用和维护带来很大的困难。因此,在跟函数无关或者关联很弱的代码不要放到函数里面,否则的话会导致函数职责不明确,难以理解和修改。

2、重复代码提炼成函数

重复的代码给人的直观感受就是啰嗦,明明说一遍别人就能记住的事情,非要说好几遍!
因此一定要消除重复代码,将其提炼成函数。

3、不同函数用空行隔开

不同的函数使用空行隔开,如果函数需要导出的话,它的 EXPORT*宏应该紧贴在他的结束大括号下,比如:

int system_is_up(void)
{
    return system_state == SYSTEM_RUNNING;
}
EXPORT_SYMBOL(system_is_up);

4、函数集中退出方法

我们在学习 C 语言的时候都会听到或者看到这种说法:少用、最好不要用 goto 语句,但是linux 源码中确大量的使用到了 goto 语句, linux 源码使用 goto 语句来实现函数退出。当一个函数从多个位置推出,并且需要做一些清理的常见操作的时候, goto 语句就很方便,如果不需要清理操作的话就直接使用 return 即可,如下所示:

int fun(int a)
{
    int result = 0;
    char *buffer;

    buffer = kmalloc(SIZE, GFP_KERNEL);
    if (!buffer)
        return -ENOMEM;

    if (condition1) {
        while (loop1) {
            ...
        }
    result = 1;
    goto out_buffer;
}
    ...
out_buffer:
    kfree(buffer);
    return result;
}

5、函数嵌套不能过深,新增函数最好不超过 4 层

函数嵌套深度指的是函数中的代码控制块(例如: if、 for、 while、 switch 等)之间互相包含的深度, 嵌套会增加阅读代码时候的脑力,嵌套太深非常不利于阅读!

6、对函数的参数做合法性检查

函数要对其参数做合法性的检查,比如参数如果有指针类型数据的话如果不做检查,当传入野指针的话就会出错。比如参数的范围不做检查的话可能会传递进来一个超出范围的参数值,导致函数计算溢出等。因此函数必须对参数做合法性检查,比如 STM32 的官方库函数就会对函数的参数做合法性的检查。

7、对函数的错误返回要做全面的处理

一个函数一般都会提供一些指示错误发生的方法,一般都用返回值来表示,因此我们必须对这些错误标识做处理。

8、源文件范围内定义和声明的函数,除非外部可见,否则都应该用 static 函数

如果一个函数只在同一个文件的其它地方调用,那么就应该用 static, static 确保这个函数只在声明它的文件是可见的,这样可以避免和其它库中相同标识符的函数或变量发生混淆。