extern & static
1> 解决:重复定义问题
文件: main.h
#ifndef __MAIN_H__
#define __MAIN_H__
int add; // 定义一个全局变量;
void test(void); //函数声明
#endif // main.h
文件: main.c
#include "main.h"
int main(void)
{
int a = 1;
int b = 1;
add = a + b;
test();
return 0;
}
文件: fff.c
#include "main.h"
#include <stdio.h>
void test(void)
{
printf("add = d%", add);
}
编译后报警:symbol add multiply defined
2> 定义和声明
2.1> 定义
-
定义一个对象,对象包含:1》函数,2》局部变量; 3》全局变量;
-
为对象分配内存空间
注意:定义只能定义【1】次, 声明可以多次声明;
2.2> 声明
- 给编译器说要使用一个对象, 对象包含:1》函数,2》局部变量; 3》全局变量;
- 这个对象在其他文件已定义;
2.3> 函数的定义和声明
文件:main.c
# include <stdio.h>
// 为了使用这个函数,需要在前面声明;
void fun(void); // 默认含有extern
extern void fun(void); // 声明多次没问题;
int main()
{
fun(); // 函数调用;
return 0;
}
/* 函数的定义 */
void fun()
{
printf("Hello!")
}
/* 重复定义 */
void fun()
{
printf("Hello!")
}
2.4> 局部变量定义和声明
文件:main.c
int main()
{
int a = 1; // 局部变量作用域小,就不需要声明;
int a; // 局部变量重定义
return 0;
}
2.5> 全局变量定义和声明
文件:main.c
#include <stdio.hj>
extern int a; // 声明,要用这个变量,这个变量在其他方定义了;
int main()
{
printf("a = d%", a);
return 0;
}
int a = 10;
3> 变量作用域
3.1> 全局变量作用域
位置:在函数外定义;
作用域:从定义处到所在文件结束;
文件:main.c
#include <stdio.h>
int a = 10; //-- 全局a变量作用域 Start --//
int main()
{
return 0;
}
//--------- 全局a变量作用域 End -----------//
3.2> 局变量:4个作用域
位置:在函数内定义;
作用域:局限下函数内;
1》 形式参数 :作用域:整个函数体;
2》 函数体中定义变量;作用域:定义处至函数结束;
3》 for语句中定义变量;作用域:整个for语句;
4》 语句块中定义变量:作用域:定义处至该语句块结束;
文件:main.c
#include <stdio.h>
int main()
{
int a = 2; // 函数体中定义的变量a;
for (int i=0; i<10; i++)// i的作用域只是for循环中;
{
}
{
int b = 6; // 语句块中定义变量
//-------- b的作用域结束 ---------//
}
return 0;
//------- a的作用域结束 ------//
}
void fun(int formal) // formal:形式参数;作用域Start
{
} // formal作用域End;
4> 作用域改变
4.1> extern: 扩展全局变量作用域
4.1.1> 同一个文件扩展
// file :mian.c
#include <stdio.h>
void fun()
{
extern int a; //-- 全局a变量 扩展后 作用域 Start --//
printf("a = d% \n", a);
}
int a = 10; //--- 全局a变量 原作用域 Start ---//
int main()
{
fun();
return 0;
}
//--------- 全局a变量作用域 End -----------//
4.1.2> 多个文件扩展
//file: mian.c
#include <stdio.h>
extern int a;
void fun()
{
printf("a = d% \n", a);
}
int main()
{
fun();
return 0;
}
//file: fff.c
#include <stdio.h>
int a = 10;
4.2> extern: 扩展函数作用域
4.3> static: 限定全局变量作用域
//file: mian.c
#include <stdio.h>
extern int a;
void fun()
{
printf("a = d% \n", a);
}
int main()
{
fun();
return 0;
}
//file: fff.c
#include <stdio.h>
static int a = 10; // 把全局变量 a 作用限定为 只能 fff.c使用;
4.4> static: 限定函数作用域
5> 变量的存储方式
5.1> 静态存储
整个程序运行过程中存在;
如:全局变量
5.2> 动态存储
在程序运行过程中某一时间段存在;
局部变量:使用时分配空间,出作用域就释放空间;
5.3> static: 改变局部变量存储方式为静态存储
静态局部变量,初始化只初始化一次;
//file: mian.c
#include <stdio.h>
void fun()
{
int a = 0;
a++;
printf("a = d%\n", a);
}
int main()
{
for(int i=0; i<3; i++) {
fun();
}
return 0;
}
运行结果:
a = 1;
a = 1;
a = 1;
加static:
//file: mian.c
#include <stdio.h>
void fun()
{
static int a = 0;
a= a + 1;
printf("a = d%\n", a);
}
int main()
{
for(int i=0; i<3; i++) {
fun();
}
return 0;
}
运行结果:
a = 1;
a = 2;
a = 3;