static用法:

在C中,static主要定义全局静态变量、定义局部静态变量、定义静态函数。

1、定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量。全局静态变量有以下特点。
a.在全局区分配内存。
b.如果没有初始化,其默认值为0.
c.该变量在本文件内从定义开始到文件结束可见。

2、定义局部静态变量:在局部变量前面加上关键字static,其特点如下:
a.该变量在全局数据区分配内存。
b.它始终驻留在全局数据区,直到程序运行结束。
c. 其作用域为局部作用域,当定义它的函数或语句块结束时,其作用域随之结束。

3、定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:

a.静态函数只能在本源文件中使用

b.在文件作用域中声明的inline函数默认为static类型

总结:用static定义的全局和局部静态变量的区别是,全局的静态变量的作用域和可见域都是从文件的定义开始到整个文件结束;而局部的静态变量可见域是从文件的定义开始到整个文件结束,作用域是从该语句块的定义开始到该语句块结束

extern的用法:

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文件)。即区别就在于“全局”的范围是整个工程,还是自身编译单元。

c语言中external,static关键字用法相关推荐

  1. C语言中的extern关键字用法

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的,要在此处引用". 1. extern修饰变量的声明.举例来说,如果文件a.c需要引用b ...

  2. c语言中的static关键字的作用

    在我们日常使用过程中,static通常有两个作用: 1.修饰变量 静态全局变量:全局变量前加static修饰,该变量就成为了静态全局变量.我们知道,全部变量在整个工程都可以被访问(一个文件中定义,其它 ...

  3. JAVA语言中的this关键字用法

    this关键字的三种用法: 通过this关键字可以明确的访问一个类的成员变量,解决成员变量与局部变量名称冲突问题. 实例: public class Student {//定义四个成员变量String ...

  4. C语言中的static的用法(超级详细)

  5. c语言sinx的作用,C语言中 sinx cosx 的用法

    #include #include int main() { double pi=acos(-1.0); double angle; scanf("%lf",&angle) ...

  6. c语言中rand()的作用,c语言中的rand()函数用法

    rand() rand()函数作用:用来产生随机数,但是,rand()的内部实现是用线性同余法实现的,是伪随机数,由于周期较长,因此在一定范围内可以看成是随机的. rand()函数返回:返回一个范围在 ...

  7. c语言中的static变量和static函数

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的修饰变量作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函 ...

  8. C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。

    C/C++中Static的作用详述 在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加s ...

  9. python语言中with as的用法使用详解

    本篇文章主要介绍了python语言中with as的用法使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 With语句是什么? 有一些任务,可能事先需要设置,事后做 ...

  10. c语言中ANSI标准的关键字,C语言中32个关键字详解

    C语言中32个关键字详解 由 ANSI 标准定义的 C 语言关键字共32个,根据关键字的作用,可以将关键字分为数据类型关键字和流程控制关键字两大类. 一.数据类型关键字 A 基本数据类型(5个) vo ...

最新文章

  1. C#面向对象名词比较(一)
  2. (一)Web Service——基本概念
  3. java 过滤器 弹出提示_JavaWeb 过滤器——验证登录 防止未登录进入界面
  4. PMOS 和 NMOS区别
  5. mysql 字符串取前缀_mysql截取字符串的函数总结
  6. Docker学习文档之一 安装软件-Windows环境
  7. (一)边缘AI:口罩检测
  8. HDU 1561 The more, The Better (树形dp)
  9. KVM详解(二)——KVM安装部署
  10. Angular2开发拙见——组件规划篇
  11. Log4cpp 库安装及使用
  12. Excel后缀名 .xls和.xlsx 有什么区别?
  13. LeetCode 最热100题 最短路径和,minimum path sum
  14. 关于BHO不能够正常运行的问题!
  15. vim ide_将Vim变成R IDE
  16. php中 使用dsa算法,DSA加密算法解析
  17. 微信小程序iconfont的图标引入
  18. 【SemiDrive源码分析】【X9芯片启动流程】21 - MailBox 核间通信机制介绍(代码分析篇)之 Mailbox for Linux 篇
  19. 转载:Joel Spolsky: 创业公司如何公平分配股权?
  20. Visual Studio Code(VS code) python代码无法进行变量和函数跳转

热门文章

  1. 2021-2027全球与中国经颅磁刺激仪(TMS)市场现状及未来发展趋势
  2. etcd 笔记(02)— etcd 安装(apt 或 yum 安装 、二进制包安装、Docker 安装 etcd、etcd 前端工具etcdkeeper)
  3. Lidar激光雷达市场
  4. NVIDIA GPU自动调度神经网络
  5. 如何写新的C++ OP
  6. Turing渲染着色器网格技术分析
  7. 视频系列:RTX实时射线追踪(上)
  8. CentOS7安装Python3详细步骤与Python2共用方法
  9. 【CV】Pytorch一小时教程添加损失函数图像可视化训练过程
  10. HarmonyOS ToastDialog 的使用