c语言全局变量(extern)和静态全局变量(static)的使用、拓展作用域(全局、局部等)

系列文章目录



前言


一般来说有三个地方可以定义变量:

在函数或一个代码块内部声明的变量,称为局部变量。

在函数参数的定义中声明的变量,称为形式参数。

在所有函数外部声明的变量,称为全局变量。

作用域是程序的一个区域,变量的作用域可以分为以下几种:

局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后被销毁。

全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。

块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。

类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的生命周期与类的生命周期相同。

扫描二维码关注公众号,回复: 15914868 查看本文章

注意:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。

一、extern的全局变量

1.1 用法

不同的文件共用一个变量,且不改变定义变量的文件位置。

  1. 一个c文件需要调用另一个c文件里的变量或者函数,而不能从.h文件中调用变量,头文件的引用只能使用头文件.h文件内变量和函数:
例如:a.h  在a.cpp定义了一个int gogal全局变量,就算b.h引用该头文件,也不能够使用gogal全局变量
    不建议从.h定义全局变量,因为该头文件可能会被多次引用,造成重复定义全局变量,编译报错;
  1. extern int a = 5与in a = 5意义是一样的,都是定义。而extern int a;是声明。但会产生一条警告。
  2. 对于函数而言,和引用变量是一样的,如果需要调用其他.c文件中的函数,在文件中的函数声明前加extern即可,不加extern而直接声明函数也可以,因为声明全局函数默认前面带有extern。

1.2 代码示例

目录结构
在这里插入图片描述
test.h
在这里插入图片描述
test.cpp
在这里插入图片描述
test2.h
在这里插入图片描述

test2.cpp
在这里插入图片描述
main.cpp
在这里插入图片描述
运行截图:
在这里插入图片描述

二、static的静态全局变量

1.1 用法

如果不想让其他.c文件引用本文件中的变量,使用static即可;

类似于c++中类的私有成员变量,只能通过类对象内部去修改,不能够通过外接直接修改变量值;

1.2 代码示例

test.h
在这里插入图片描述
test.cpp
在这里插入图片描述

main.cpp
在这里插入图片描述
运行截图:
在这里插入图片描述

三、拓展作用域

一般来说有三个地方可以定义变量:

在函数或一个代码块内部声明的变量,称为局部变量

在函数参数的定义中声明的变量,称为形式参数

在所有函数外部声明的变量,称为全局变量

作用域是程序的一个区域,变量的作用域可以分为以下几种:

  • 局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后被销毁。

  • 全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。

  • 块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。

  • 类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的生命周期与类的生命周期相同。

注意:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。

总结

  • 了解作用域,方便以后创建自己想要的变量和函数;
  • 了解全局变量的创建;
  • 了解关键字extern的使用。

猜你喜欢

转载自blog.csdn.net/weixin_55491446/article/details/131175408