新闻  |   论坛  |   博客  |   在线研讨会
Linux C - C基础篇八(函数)
嵌入式Linux | 2023-01-12 14:56:51    阅读:175   发布文章

概念

函数可以被看作是一个由用户定义的一系列操作的集合。一般来说,函数用一个名字来表示。函数的操作数,称为参数,由一个位于括号中,并且用逗号分隔的参数列表指定,如果该函数没有参数需要传入,则这个列表为空,或者仅有关键字void;函数的结果被称为返回值,返回值的类型被称为函数返回类型,不产生返回值的函数,返回类型是void,意思是什么都不返回;函数执行的动作在函数体中指定,函数体包含在一对花括号中。函数返回类型、以及其后的函数名、参数列表和函数体构成了函数定义:

返回值类型 函数名(参数列表)

{

函数体

}

用户自定义函数

如下,函数的名字是sum,返回值类型是int,有两个参数分别是int型的a和int型的b。

函数声明由函数返回类型、函数名、参数列表构成,由";"结尾,这三个元素被称为函数声明或函数原型。函数原型描述的是函数的接口,它详细描述了调用函数时需要提供的参数的类型和个数,以及函数返回值的类型。一个函数可在一个文件中被声明多次,一个函数通常需要先声明,然后才能被调用。例如上面的sum函数声明如下:

int sum(int a, int b);

库函数

库函数就是把一些常用的函数放到库里,供别人使用的一种方式。调用的时候把它所在的文件名用#include<>加到里面就可以了。库函数一般是放到lib文件里的。库函数的源代码一般是不可见的,但在头文件中(xxx.h)你可以看到它对外的接口。下面就是调用lib里面的库函数printf打印内容到终端的实例,因为库函数printf再头文件stdio.h中声明,所以需要使用#include<stdio.h>来引用,在添加引用后,编译器才能在调用这个函数的时候找到它。

函数调用

函数调用通常需要先声明,然后再调用。库函数的调用,直接包含它所在的头文件即可#include <xxx.h>。如果是我们自己定义的函数,如果再文件内调用,则只需在调用之前声明这个函数即可;如果是在文件外调用,我们通常将这个函数声明写在一个头文件中,例如xxx.h中,然后在调用的地方通过#include "xxx.h"即可调用。

回调函数

举个例子,酒店提供叫醒服务,但是要求客人自己决定叫醒的方法。可以是打客房电话,也可以是派服务员去敲门,睡得死怕耽误事的,还可以要求往自己头上浇凉水等等。这里,“叫醒”这个服务是酒店提供的,相当于库函数,但是叫醒的方式是由旅客决定并告诉酒店的,也就是回调函数。而旅客告诉酒店怎么叫醒自己的动作,也就是把回调函数传入库函数的动作,称为注册(register)回调函数,也就是说回调函数注册后不会里面调用,而是等到需要调用的时候再回来调用。

如上面我的的回调函数的例子,其中register_service就是用来注册回调函数的,注册的目的就是现在不调用,但是在需要回调的时候,我可以找到这个函数。上面的service_zhangSan、service_liSi就是回调函数,所以看来回调函数和普通的函数并没有区别,只不过是使用的场景不同。

不定参函数

我们平时常用的函数参数个数都是固定的,但是有时候也会用到一些参数不固定的函数,例如printf等一系列函数,这些函数的参数的个数是不确定的。下面我写个简单的例子来阐述下不定参函数的实现:


*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
专注于嵌入式Linux知识的分享、交流
推荐文章
最近访客