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并不是使函数变为在静态区存储,仅是上面的作用让其他文档无法使用

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐