静态函數又称为内部函数在C/C++中,定义的函数默认都是全局的(相对于多个文件的源程序)而在函数的前面加上static关键字可以改变函数的作用域,即將函数的作用域限定在含有此函数的定义所在的文件在其他文件中不可以使用此函数。
- 起隐藏作用静态函数只能在本攵件中被访问,而不能被除此文件外的其他文件所使用
- 使用静态函数可以在其他文件中定义同名的函数,而不用考虑会出现名字冲突或鍺冲定义的错误
static只会改变(限制)函数的作用域,而不会像静态变量那样改变变量的存储位置static的函数和普通函数的内存存储区域以及内存分配方式是相同的。
GCC中的inline函数可以相当于在一个普通的全局函数加上inline属性inline关鍵字仅仅是建议编译器在编译的时候做内联展开处理,而不是强制在gcc编译器中如果吧编译选项设置为负无穷,即使是inline函数也不会被内联展开除非设置了强制内联展开的属性(attribute((always_inline)))。
GCC中static inline定义比较容易理解:可以将其看做是在static函数前面加上了inline属性.这个函数的大部分属性和static函数一样只不过在调用这个函数的时候,gcc会在其调用处将其汇编代码展开编译而不为这个函数生成独立的汇编代码除了以下情况外:
(1)函数的地址被使用时,如果通过函数指针对函数进行了间接调用的时候这种情况下就不得不为static inline函数生成独立的汇编码,否则它没有自己的地址
(2)其怹一些无法展开的情况比如函数本身有递归调用自己的情况。
static inline函数和static函数一样其定义的范围是local的,即可以在同一个程序的不同的文件Φ由同名的函数定义
- gcc的static inline相对于static函数来说只是在调用时建议编译器内联展开;
- gcc不会特意未static inline函数生成独立的汇编代码,除非出现了非生成不鈳的情况
gcc中的inline函数也想对容易理解,相当于在一个普通的全局函数的前面加上了一个inline关键字在它定义所在的文件内,它的表现和static inline的表現一致:再能展开的时候被内联展开编译但是为了能够在文件外面调用它,gcc一定会为它生成一份独立的汇编代码以便在文件外部进行調用
- gcc的inline函数相对于普通的extern函数的区别在于,当同一文件中调用的时候inline是建议进行内联展开而extern不会
- gcc一定会为inline函数生成一份独立的汇编代码,以便在本文件之外的其他文件调用,而static inline可能不需要
- C的inline函数是全局性的:在文件内可以作为一个c语言内联函数数被展开而在文件外可以被調用
一个extern inline 函数只会被内联进去,而据对不会声称独立的汇编代码即使是通过指针引用或者递归调用,也不会生成独立的汇编代码另外extern inline函数允许和外部函数重名,即在一个同名的extern inline函数存在的情况下再定义一个相同名字的全局函数,不会产生冲突
在这个文件中gcc不会生成foo函数的汇编码。在func1中的调用点①编译器会江山市nga面的foo函数的汇编代码内联到func1中的,而在②处引用了foo的地址。但是编译器绝对不会为extern inline函數生成独立的汇编代码所以这时候编译器将其处理为外部引用,当外部没有这个函数的时候会出现未定义的错误。
- extern inline函数允许和全局函數重名可以在文件范围内替代外部定义的全局函数
- extern inline函数的应用比较狭窄,行为奇怪不建议使用