extern的用法、声明与定义、static作用
1.extern是声明不是定义
extern是声明该变量或函数是已经在其他文件中定义好了的,编译器无需检查
1.1 声明是什么,定义是什么
(1)定义只能出现一次,声明可以出现多次
(2)定义创建了对象并且分配了内存,声明没有分配内存只是告知编译器该对象已经分配好内存了、该对象名字已经被占用了
- 定义示例
int a=10;
char b[10];
typedef int c;
void fun(int a,int b)
{
return a+b;
}
- 声明示例
extern int a;
void fun(int a,int b);
extern int max(int a ,char *b);
1.2 extern应用例子
想要完成这样的事情:使用指针指向“Hello”,然后改变指针指向“ World”,分步打印出“Hello World”,在这个过程中会用三个.c文件去实现
例如在file1.c文件中
//file1.c
#include<stdio.h>
const char *a="Hello";
void hell()
{
printf("%s",a);
//return 0;不需要写因为你的hell类型为void
}
在file2.c文件中
//file2.c
//#include<stdio.h> //没用到printf()所以可以注释掉
extern const char *a;//要声明a
void modify()
{
a=" World";
}
在main.c文件中
//main.c
#include<stdio.h>
extern const char *a;//要声明a已定义在其他文件
void hell();//要声明hell()函数已定义,函数自带extern
void modify();//同上一条代码
int main()
{
hell();
modify();
printf("%s",a);
return 0;
}
之后再终端链接并生成想要的文件m.exe
PS E:\C_language\pragram\Test> gcc -o m.exe file1.c file2.c main.c
PS E:\C_language\pragram\Test> .\m.exe
结果是
Hello World
2.static关键字作用

2.1修饰变量
static可以修饰变量使其变成静态存储区域的数据
| 全局变量 | 局部变量 | |
| 作用范围 | 该文档、跨文档 | 仅限函数内部 |
| 生命周期 | 整个程序运行期间 | 函数调用时 |
| 存储区域 | 静态存储区 | 栈 |
| 全局变量 | 静态全局变量 | |
| 作用范围 | 该文档、跨文档 | 该文档 |
| 生命周期 | 整个程序运行期间 | |
| 存储区域 | 静态存储区栈 | |
| 静态局部变量 | 局部变量 | |
| 作用范围 | 仅限函数内部 | |
| 生命周期 | 整个程序运行期间 | 函数调用时 |
| 存储区域 | 静态存储区 | 栈 |
(1)全局变量
定义在所有函数外部的变量就是全局变量,在整个程序运行期间都存在的变量,能被整个文档所使用(也可跨文档)
其中如果修饰的是全局变量,会使全局变量变成仅供该文档使用,其他的文档都用不了,即使加了extern也不行
例如以下代码:两个文档对指针变量的使用
//file1.c
const char *a="hello world";//修改为static const char *a="hello world"则main.c找不到a定义
//main.c
#include<stdio.h>
extern const char *a;
int main()
{
printf("%s",a);
return 0;
}
运行及输出如下:
PS E:\C_language\pragram\Test> gcc -o m.exe file1.c main.c
PS E:\C_language\pragram\Test> ./m.exe
hello world
(2)局部变量
局部变量是指在函数内部定义的变量,生命周期是调用函数的时候,函数内定义的变量只能在供该函数使用
但是由static修饰的局部变量,生命周期变为整个程序运行期间,这是因为修饰后局部变量由栈区域存储变为了静态区存储,静态区存储的变量具有该特征,并且局部静态变量仅第一次执行时初始化
例如以下代码说明局部变量初始化仅进行一次
#include<stdio.h>
void count(void)
{
static int a=0;//每次调用时,仅第一次初始化有效
a++;
printf("%d\n",a);
}
int main()
{
count();
count();
count();
return 0;
}
输出如下,仅第一次运行时初始化a为0;
PS E:\C_language\pragram\Test> gcc -o m.exe main.c
PS E:\C_language\pragram\Test> ./m.exe
1
2
3
2.2修饰函数
函数自带extern的属性,在文档1写的函数fun(),在文档2中仅需声明后便可使用fun()
但是加了static修饰的函数,函数变为仅可在文档1使用,其他文档都无法使用
注意这里的static并不是使函数变为在静态区存储,仅是上面的作用让其他文档无法使用
更多推荐


所有评论(0)