inline_and_static
有关c++和c中inline和static关键字的一些思考
老师上课的时候并没有细讲这些关键字,但是我在实际编程的过程中,
却因为这两个关键字遇到了许多问题于是就通过互联网细细地了解了一下,
感觉这两个关键字在编程中还是很重要的。
inline
首先是inline关键字,在c++和c中都是起到让编译器在调用位置展开函数的作用,
但是inline在c++中是最开始就有的,而在C语言则是在c99后才有的inline。
在c++中使用inline时,是会进行内联的,同时c++类内部定义的函数也是默认内联的。
但在c中不一样,gcc编译器编译代码是将inline函数作为建议内联,实际不一定会内联。
同时c语言中inline还分为三种分别是:inline,static inline,extern inline。
inline就是建议内联,然后是只在其定义所在的文件进行内联,本身是会生成汇编码,
以便其他文件调用的。所以如果在头文件中添加inline声明的函数的定义,被多个源
文件包含,链接的时候是会报错的。而static inline 则不会生成单独的汇编码,但是由于声明是静态的,所以只在定义了
该函数文件内可用,也就是说要在多个源文件中使用就得在多个文件中定义,故其定义
一般写在头文件中,而相较于static的函数,主要特点就是为函数本身生成单独的汇编码。extern inline 在c99标准中没有提及,但是在gcc中可以声明,但是其行为古怪,编程
时一般用不上,故不作介绍。
在c++中使用两种关键字,编译器的处理则往往是两种关键字效果的简单叠加,其实在c++中只要
能够进行内联而且指定内联的就一定会内联,也就是说除了递归函数等特殊情况都会将声明内联
的函数进行内联,而且在c++中声明了内联的函数即使最终无法内联也会自动只生成一次汇编码,
进行函数调用。
有关inline使用的一些建议
- inline函数不要超过10行代码,且不能包含循环、switch、if语句
- 在一个c文件中定义的inline函数是不能在其它c文件中直接使用,(如果要用,应该写在头文件中并添加static)google推荐把inline函数定义在**-inl.h头文件中。
- 不要过度使用inline函数定义,尤其对大函数来说
static
static关键字在c和c++中的作用类似,主要有两种作用:
- 在函数内部使用时,可以是变量在程序运行时永远存在。
- 在函数外部声明变量和函数时,可以使函数和变量对其他
翻译单元不可见从而避免链接的重定义错误。但这样定义
的函数在每个翻译单元中即使是相同的函数也会额外地生成
汇编码降低编译速度。
参考文章:
https://www.cnblogs.com/java20130726/p/3218639.html
https://blog.csdn.net/liyuanbhu/article/details/42470577
一些想法
- 我们在编写代码时似乎不仅仅是在和程序交流的过程,也是在和编译器交流的过程:
我们不仅是希望我们的程序通过不断地运行最终实现特定的功能,或者是得到我们想要结果,
而且要和编译器进行沟通,不断地通过各种关键字告诉它我们希望这个程序应该是什么样地
过程。
例如:
- const关键字编译器编译时会给你检查这个变量是否保存不变,实际就是我们在告诉编译
器这个变量应该是不变量。 - private关键字就是我们告诉编译器这个变量或者函数应该是私有的。
- inline关键字就是我们告诉编译器这个函数应该是内联的等等。
所以实际上编程的过程也是在和编译器或者解释器交流的过程。
2. 在这个沟通的过程中成功了,那就是编译成功,但是还是有可能会存在
运行时的错误。
有一些编程语言的编译器,会帮你检查更多的内容,这样的语言和编译器
交流成功后运行时就会减低产生错误的可能。
而有些语言则会给编程者更多自由发挥的可能,但随着而来的可能就是
更多运行时的报错。
这也是需要有不同语言的原因之一。
inline_and_static