文章目录
- 函数参数缺省
- 函数参数缺省的条件和要求
- 内联函数
- 内联函数的工作原理
- 内联函数的定义方法
- 内联函数的要求
- 解决方法:直接在.h中定义内联函数的函数体
- 内联函数再Debug模式下默认是不展开的
函数参数缺省
顾名思义:可以少传一个/多个参数给函数,但是该函数还能正常运行
例
不像C语言中函数定义了几个参数就必须传几个参数函数才能工作
函数参数缺省的条件和要求
-
必须
在声明或者定义时给形参一个默认值
如
这样函数在参数缺省的时候就可以用形参的默认值工作,再有参数传入时,从左往右
把默认值覆盖 -
给函数的形参默认值时
必须从右往左
给【即右边的有默认值了,才能给左边的形参默认值】
例
这样可以
但是这样不行
为什么呢?
因为函数形参接收参数是从左往右接收
的,所以左边的形参先接收到参数,如果少传了参数,参数就会被左边的形参数接收完毕,此时如果右边的形参没有默认值,函数就工作不了了 -
给函数默认值时
不能
跳着给
-
函数给默认值时,如果
函数有声明就必须在声明时给默认值
,定义时不能再给
例
内联函数
内联函数是用空间换取时间的函数
注意:内联函数是程序员对编译器的建议
如果程序员设定的内联函数的函数体太长,编译器就可能不会将它作为内联函数,还是将它视为普通函数
内联函数的工作原理
①把函数实现放在代码区,不放在栈区
(即把函数的函数体展开在代码里,有点类似宏函数的展开)
②把函数时间放在了代码区,就不用传参
去掉了传参的时间。
也省去了操作系统给栈区函数的形参分配值的时间。
③不放在栈区实现,操作系统就不用销毁回收空间,去掉了操作系统回收空间的时间。
内联函数的定义方法
直接在函数定义//声明的返回值前+一个关键字inline
即可
例
内联函数的调用方法和普通函数一样
内联函数的要求
函数体
不能太长,代码不能太多
为什么?
假设一个内联函数的函数体为100行代码
它会被调用100000次,每一次调用都会展开一次函数体到代码区去
那么它就会在代码区展开出100000*100
行代码,会有很多重复的代码
而且这些代码都会被存在最终的可执行程序中
,导致可执行程序的大小变大
而此时如果不用内联,那存入可执行程序的代码
就只有100000+100
行代码
其中100000行代码都是调用该函数的代码,100行代码是该函数的函数体
因为普通函数的函数体在栈中,每次调用时都会开辟栈区空间,再栈区空间中执行函数体,每次调用函数都是重复使用那函数的100代码
函数体里面不能有递归调用
因为内联函数每次调用都要在调用位置展开内联函数的函数体
而编译器
不知道递归什么时候能结束,就不知道会展开多少次,所以编译器不会接受把递归函数做内联函数
内联函数声明和定义不能分离在不同文件中
【在同一文件中可以】
例
普通函数是可以分离的
内联函数不能分离
为什么呢?
因为内联函数是不进编译链接时的符号表的,也没有地址
所以链接时找不到
解决方法:直接在.h中定义内联函数的函数体
因为被包含的头文件会在预处理时展开,所以包含了头文件的文件就内使用该头文件中定义的东西
(不了解编译和链接的可以看我这篇文章:c语言编译和链接)
例
内联函数再Debug模式下默认是不展开的
因为展开了就和宏一样不方便调试