我们之前已经了解了有关函数的一些知识,今天继续学习!
函数的定义和声明
单个文件
函数必须先声明后使用
第一种方法
其实函数的定义也是一种特殊的声明,所以第一种方法就是将定义函数放在主函数之前,这样就可以直接使用

第二种方法
如果我们想把函数的定义放在主函数之后又该怎么做呢

函数的声明要交代清楚函数名,函数的返回类型和函数的参数(参数也可以只保留类型,省去参数名) 。就好比你想使用一件物品,你可能不需要知道它是如何运作的(这就是声明时不写函数体的原因),但是你首先就得了解它的名字,用途和使用它所需要的条件吧。
函数的声明也不是必须要放在最前面,只需要在使用它之前声明就好了。
多个文件
当我们写的代码比较多的时候,不会将所有代码都放在一个文件中,往往会根据程序的功能,将代码放在多个文件中。一般情况下,我们将函数的声明和类型的声明放在头文件中(.h),函数的实现是放在源文件中(.c)



函数的作用域和生命周期
作用域
通常来说,一段代码中所用到的名字并不总是有效的,而限定这个名字的可用性代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围 ,我们也可以理解为C语言中的{}限定了变量的作用范围

2.全局变量的作用域是整个项目

也许你会有一个疑惑,是世界上同名同姓的人那么多,光听名字叫人无法分辨谁是谁,如果函数中的全局变量和局部变量也发生这样的情况,会不会感到疑惑呢?

生命周期
局部变量的生命周期:进入作用域变量创建,生命周期开始,出作用域时生命周期结束
全局变量的生命周期:整个程序的生命周期
static和extern
static和extern是C语言中的两个关键字
extern
extern的作用是声明外部符号的,方便跨文件使用
static
顾名思义,static是静态的意思,有三个作用
static修饰局部变量

为什么会出现这样的情况呢,现在逐个分析
代码1:在test函数中的a创建好后 ,出函数时是不会被销毁的。进入函数也不会重新创建变量,直接累积上次的值进行计算
代码2:test函数中的局部变量i是每次进入函数时创建并赋值的变量(这是它生命周期的开始),然后出函数时它的生命周期结束(释放内存)
由此我们可以得出结论:
static修饰局部变量改变了变量的生命周期,生命周期的改变的本质是改变了变量的存储类型。本来局部变量是存储在内存的栈区的,但是被static修饰后存储到了静态区。存储在静态区的变量和全局变量是一样的,因此生命周期和程序的生命周期是一样的,只有程序结束,变量才会被销毁,内存才回收。但需要注意的是,作用域是不变的。
static修饰全局变量
全局变量默认具有外部链接属性的,在外部文件想要使用,只要适当的声明就可以使用。而在用static修饰后,外部链接属性就变成了内部链接属性,使得这个全局变量只能自己所在的源文件中使用,如果在其他文件中声明依旧无法使用。
以下是一个具体例子:

static修饰函数
static修饰函数的情况与全局变量的情况一样。本质上是因为函数默认有外部链接属性,这使得函数在整个工程中只要有适当的声明就可以被使用。但是被static修饰后就变成了内部链接属性,是得函数只能在自己源文件内部使用。
1703

被折叠的 条评论
为什么被折叠?



