嵌入式编程中“函数”的不同(重点内联函数和宏函数)【拜托了,物联网!】
0前沿
在使用LiteOS编程,或是其他什么单片机编程时,我们常常需要自己自定义很多函数来实现我们自己的APP(功能模块),这样我们写的不同种类的“函数”有什么区别呢?
1、函数
我们在使用使用C、C++编程时最常使用的到的就是函数,函数有哪些呢?常见的有三类:外部函数、静态函数、内联函数
还有就是利用宏定义实现的宏函数。
1.1静态函数
static修饰的函数叫做静态函数,静态函数只是在声明他的文件当中可见,不能被其他文件所用。
1️⃣ 其他文件中可以定义相同名字的函数,不会发生冲突
2️⃣ 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。
我们常见的自己编写的函数多为静态函数,作用在该文件中进行使用。
1.2外部函数
C语言外部函数是一种可在自身所处的源文件及其他源文件中都能被调用的函数。外部函数的作用域是整个源程序。
1.3内联函数
今天的主角之一,其定义是是一种编程语言结构,用来建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展);也就是说建议编译器将指定的函数体插入并取代每一处调用该函数的地方(上下文),从而节省了每次调用函数带来的额外时间开支。
1.4宏函数
今天的第二个主角,即用大量的宏定义来组织功能代码,实现函数的作用。
2、内联函数
内联扩展是一种特别的用于消除调用函数时所造成的固有的时间消耗方法。一般用于能够快速执行的函数,因为在这种情况下函数调用的时间消耗显得更为突出。这种方法对于很小的函数也有空间上的益处,并且它也使得一些其他的优化成为可能。
内联函数可提高函数的时间效率,提升代码的效率。
内联函数包含在 ISO C99 标准中,但目前 GCC 实现的内容与 ISO C99 标准要求的内容之间存在重大差异。
inline int max (int a, int b)
{
if (a > b)
return a;
else
return b;
}
上面的代码在C99下运行的效率接近于宏的效果,既:
a = max (x, y); // 等价于 "a = (x > y ? x : y);"
3、宏函数
宏定义可以像函数调用一样在代码中使用,称为函数式宏定义(Function-like Macro),叫做“宏函数”。
宏函数,并非一个函数,二是宏定义的一段展开式,并不参与编译,没有参数检查等操作。
#define MAX(a, b) ((a)>(b)?(a):(b))
k = MAX(i&0x0f, j&0x0f)
上面代码中,MAX(),就是一个函数式宏定义,并非一个函数,这段代码展开如下:
k = ((i&0x0f)>(j&0x0f)?(i&0x0f):(j&0x0f))
宏函数的特点:
1️⃣函数式宏定义的参数没有类型,预处理器只负责做形式上的替换,而不做参数类型检查,所以危险性高;
2️⃣省去了函数的调用,返回,释放,所以效率比自定义函数高;
3️⃣调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。
4️⃣在执行复杂功能时,如递归,函数式宏定义往往会导致较低的代码执行效率。
5、如何选择使用内联函数和宏函数
宏函数和内联函数都有着快速执行响应的特点,那如何选择两种函数,宏函数因为无法参与编译优化,所以体积较大,并且参数没有类型检查存在危险性,如果代码需要快速执行,并且输入输出都是已知的特定长度的数据,那么可以选择用宏函数,如固定的算法,如何坐标变化算法(clark、park)、或是控制中常常使用PID等等,但是如果数据是需要安全检查,并且该函数被多个函数进行调用时,建议使用外部函数或是内联函数,因为可靠性更好,如LiteOS系统中用到的系统队列操作、驱动底层操作,一般都为内联函数完成。
【拜托了,物联网!】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/296704
- 点赞
- 收藏
- 关注作者
评论(0)