c语⾔中external,static关键字⽤法
static⽤法:
在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。
1、定义全局静态变量:在全局变量前⾯加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。
a.在全局区分配内存。
b.如果没有初始化,其默认值为0.
c.该变量在本⽂件内从定义开始到⽂件结束可见。
2、定义局部静态变量:在局部变量前⾯加上关键字static,其特点如下:
a.该变量在全局数据区分配内存。
b.它始终驻留在全局数据区,直到程序运⾏结束。
c. 其作⽤域为局部作⽤域,当定义它的函数或语句块结束时,其作⽤域随之结束。
3、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:
a.静态函数只能在本源⽂件中使⽤
b.在⽂件作⽤域中声明的inline函数默认为static类型
总结:⽤static定义的全局和局部静态变量的区别是,全局的静态变量的作⽤域和可见域都是从⽂件的定义开始到整个⽂件结束;⽽局部的静态变量可见域是从⽂件的定义开始到整个⽂件结束,作⽤域是从该语句块的定义开始到该语句块结束
extern的⽤法:
static修饰的变量
1、声明⼀个全局(外部)变量
当⽤extern声明⼀个全局变量的时候,⾸先应明确⼀点:extern的作⽤范围是整个⼯程,也就是说当我们在.h⽂件中写了extern int a;链接的时候链接器会去其他的.c⽂件中有没有int a的定义,如果没有,链接报错;当extern int a;写在.c⽂件中时,链接器会在这个.c⽂件该声明语句之后有没有int a的定义,然后去其他的.cpp⽂件中,如果都不到,链接报错。值得注意的⼀点:当extern语句出现在头⽂件中时,不要将声明和定义在⼀条语句中给出,也就是不要在头⽂件中写类似于这样的语句:
extern int a = 1;这种写法,在gcc编译时会给出⼀个警告:warning: 'a' initialized and declared 'extern'
注意:external声明和定义的区别,定义只有⼀次,但是声明没有限制
int a;  --->定义,默认为0(等效于int a = 0;)
extern int a;  --->声明外部变量
extern int a = 1;  --->定义性声明(即在定义的同时声明为全局变量),⼀般不提倡
⽐如:
头⽂件a.h:
extern int a = 1;
头⽂件b.h:
#include "a.h"
......
源⽂件test.c:
#include "a.h"
#include "b.h"
......
这样肯定会报错:会报错说变量a重复定义
所有⼀般(提倡)的做法是:
只在头⽂件中通过extern给出全局变量的声明(即external int a; ⽽不要写成external int a = 1;),并在源⽂件中给出定义(并且只能定义⼀次)
⽐如:
头⽂件a.h:
......
源⽂件1.c:
#include "a.h"
int a = 0;  --->定义
头⽂件b.h:
extern int a;  --->声明
源⽂件2.c:
#include <stdio.h>
#include "2.h"
void print()
{
  printf("a = %d\n", a);
}
源⽂件main.c
#include "1.h"
#include "2.h"
int main()
{
  print();
  return 0;
}
2、extern “C” { /*⽤C实现的内容(通常写在另外的.c⽂件中)*/ }
C++完全兼容C,当extern与“C”连⽤时,作⽤是告诉编译器⽤C的编译规则去解析extern “C”后⾯的内容。最常见的差别就是C++⽀持函数重载,⽽标准C是不⽀持的。如果不指明extern “C”,C++编译器会根据⾃⼰的规则在编译函数时为函数名加上特定的后缀以区别不同的重载版本,⽽如果是按C的标
准来编译的话,则不需要。
static和external定义的全局变量区别:
注意:⽤static定义的全局静态变量可以被模块内所有的函数访问,但不能被模块外其他函数访问。⽽⽤external定义的全局
1、static修饰全局变量时,声明和定义是同时给出的;⽽extern⼀般是定义和声明分开,且定义只能⼀次
2、static的全局作⽤域只是⾃⾝编译单元(即⼀个.c⽂件以及这个.c⽂件所包含的.h⽂件);⽽extern的全局作⽤域是整个⼯程(⼀个⼯程可以包含很多个.h和.c⽂件)。即区别就在于“全局”的范围是整个⼯程,还是⾃⾝编译单元。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。