变量的不同类型,决定了其生命周期及其作用域。
extern
extern 可以用来修饰变量,也可以用来修饰函数。
- 对于函数来说,既可以是
声明
一个外部函数,也可以是定义
一个函数;如:
例子一:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// test.c
void test()
{
printf("我是来自源文件test.c中的test函数!");
}
//main.c
extern void test(); //声明一个外部函数test
int main()
{
test(); //调用test.c中的函数test
return 0;
}例子二:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22// test.c
extern void test() //定义一个函数
{
printf("我是来自源文件test.c中的test函数");
}
// main.c
extern void test(); //声明一个外部函数test
int main()
{
test(); //调用test.c中的函数test
return 0;
}
对于变量来说,只能用来
声明
变量,而**不**可以定义变量;如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26//test.c
int a; //定义一个变量a
void test ()
{
printf("a = %d",a);
}
//main.c
extern int a; //声明一个外部变量a ,这里不是定义变量
extern void test(); //声明一个外部函数test
int main()
{
a = 10;
test();
return 0;
}
static
static 可以用来修饰变量,也可以用来修饰函数。
对于函数来说,可以
定义
一个内部函数;如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22//test.c
static void test() //定义一个内部函数
{
printf("我是test.c中的内部函数,其他文件无法访问。");
}
//main.c
extern void test(); //声明一个外部函数test,以便main.c文件可以访问
int main()
{
test(); //这里调用外部函数test
return 0;
}
这里编译是没有错误,运行时就会报错,因为main中的test()函数找不到定义。
对于变量来说,可以
定义
一个内部变量;如:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24//test.c
static int a; // 定义内部变量
void test()
{
printf("a = %d",a);
}
extern void test(); //声明一个外部函数test,以便main.c中可以访问
extern int a; //声明一个外部变量a,不是定义
int main()
{
a = 10; //对外部变量a进行赋值
test(); //调用外部函数
return 0;
}此时的运行结果是 :** a = 0**
因为在test.c中的变量a定义为内部变量,默认初始化为0.
小结
extern :改变作用域
static :改变生命周期