赞
踩
内容: 最近空闲时间在gitchat上看了一些linux相关的课程,也学到了一些新的知识和一些新的建议。今天分享一个:为什么很多代码在inline函数定义前面加了static呢?
在gitchat上举例了一些linux内核相关的代码,这些代码在头文件中定义了内联函数,而且在定义的时候加上了static修饰它,那么为什么这样做呢?
文中给出了linux作者的解释:
理解内联函数: 一个内联函数,可以像宏一样使用,任何想使用这个内联函数的源文件,不必亲自再去定义一遍,直接包含这个头文件,即可像宏一样使用它。通过替换函数体,可以省去函数调用的过程,从而减少了一系列出入栈,保护现场,恢复现场的过程。但是并不是使用起来都是没有问题的,所以引出要用 static 修饰呢?因为我们使用 inline 定义的内联函数,编译器不一定会内联展开,这个在一些编程书籍有提到过,而且我之前也有写过博客讲过不会被内联的情况。
比如下面的情况:
带循环的,带递归调用的函数进行内联,编译器不一定同意哦!而是要将短小,调用频繁的函数进行内联。对函数指针的调用不一定会采取内联。
总结: 那么当多个文件都包含这个内联函数的定义时,编译时就有可能报重定义错误。比如inline函数在两个不同的文件中出现,也就是说一个.h被两个不同的文件包含,则会出现重名,链接失败
而使用 static 修饰,可以将这个函数的作用域局限在各自本地文件内,避免了重定义错误。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。