关于内联函数写法的总结体会

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_25453065/article/details/82830221

关于内联函数写法的总结体会
1.内联函数的作用
在编译阶段,在调用处,将内联函数展开,展开这一点类似于宏。相应的优点则是节省了函数调用的开销。inline适合修饰函数体短小的,因为这样节省下来开销的优点才不至于被代码量过大而掩盖。

2.内联函数的基本使用方法
只需要给函数加上inline修饰即可。比如:
inline char fun (int a, int b);
inline void fun1(int a , int b)
{
return;
}

但是使用pclint静态检查的时候,我们会发现,所有使用inline函数的地方都会有个一warning信息,建议在inline前使用static修饰。所以这里主要讨论一下static和inline配合使用以及内联函数的声明和定义到底应该怎么写的问题。

讨论之前先指明实现内联展开的基本原则:

  • 在编译期间,某个.o内部可以找到该内联函数的定义,而不是只有一个声明
  • 每个.o寻找内联函数定义的范围仅限于该.c文件和它include的头文件内

按照以下几种函数声明、定义、调用情况讨论:
A. 普通函数的最常见写法—函数fun,声明在a.h、定义在a.c
1)没有使用static修饰的情况下,任何其他.c调用这个内联函数,均无法展开,只会把它当作一个普通的函数来调用。原因很简单,因为其他.c在编译期间看不到这个内联函数的定义,定义只在a.c中。
2)使用static修饰的情况下,static修饰函数的主要作用是把函数声明为私有,a.c如果要使用fun没有问题,但是其他.c就会出现找不到定义的问题,所以这种写法根本就不可行。
3)如果继续使用static修饰,为了解决找不到定义的问题,则需要在所有调用fun的.c中都添加一份static修饰的fun定义。这样的话,每个.c在编译的时候都能找到函数的定义,既解决了2)中的找不到定义的问题,又解决了1)中的内联无法展开的问题。这种方法可以真正实现内联展开。

B.函数fun,直接在a.h写函数的定义
1)没有使用static修饰的情况下,b.c/c.c等多个C文件都include了a.h,会报函数的重定义错误,连接会失败,所以这种写法也是不可行的。
2)使用static修饰,由于声明成私有,所以其他.c都有一份fun的定义也没有问题,这种写法是可行的,也是最推荐的。

综上所述,只有A/3) 和 B/2)两种方法是可以发挥内联函数的效用的,而且两中都是有static修饰的,这也就是为什么pclint会推荐增加static修饰,想要发挥效果一定是需要static的。就算只有一个.c自己定义自己调用,添加static声明为私有也是合理的。而且两种方法相比,显然B/2)更简洁。因为A/3)代码量会增大,而且后期每新增一个.c都需要增加一份该函数的定义,显然不合适。所以最合适的方法就是B/2)。

猜你喜欢

转载自blog.csdn.net/qq_25453065/article/details/82830221
今日推荐