多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

解密C语言:static静态与extern外部声明

解密C语言:static静态与extern外部声明 一extern外部声明extern 是 C/C 语言中的存储类说明符storage class specifier用于声明一个变量或函数是在其他文件中定义或者声明其具有外部链接性external linkage。简单来说extern 告诉编译器「这个符号在别处已经定义过了你只需要知道它的存在即可」从而允许在多个源文件之间共享全局变量和函数。1. extern 的核心作用跨文件共享全局变量在一个源文件中定义全局变量在其他源文件中用 extern 声明后即可访问。声明函数的外部链接性函数默认就具有外部链接性但显式使用 extern 可以增强代码可读性。配合 const 使用在 C 中const 变量默认具有内部链接性需要加 extern 才能跨文件共享。2. 基本语法extern是用来声明来自外部的符号extern变量类型 变量名extern函数返回类型 函数名(形参类型)//可不写形参名//在使用调用前声明3.实例test_1.cintt10;voidpt(intt){printf(%d,t);}test_2.c / test.hexterninttexternvoidpt(intt);4. 使用注意事项extern 只是声明不会分配存储空间真正的定义只能出现一次。声明与定义的类型必须一致否则会产生未定义行为。在头文件中使用 extern 声明变量时不要同时赋初值否则会变成定义。函数声明默认自带extern不用再在前加extern。用extern修饰函数的情况常用在函数未在.h中声明的情况下函数具有外部链接属性所以未在.h中声明也可在不同源文件中使用【会出现警告但强行用也能用】但若在.h中声明了最好使用头文件解决声明问题——更简便二static静态static 是 C/C 语言中的存储类说明符storage class specifier用于控制变量或函数的作用域与生命周期。与 extern 的「跨文件共享」相反static 的核心作用是「限制可见范围」它让变量或函数只在当前文件或当前函数内有效同时改变变量的存储期。1. static 的核心作用限制作用域修饰全局变量或函数时使其只在当前源文件内可见其他文件无法通过 extern 引用。延长局部变量生命周期修饰函数内的局部变量时变量在程序运行期间只初始化一次函数退出后仍保留其值。限定函数内部可见性修饰函数时该函数只能在本文件中调用不能被其他文件访问。2.用法分类static修饰修饰局部变量修饰全局变量修饰函数3.修饰局部变量在局部变量创建时的变量类型前加static该代码在执行时不会执行使该变量在出函数时不会被销毁下次进入该函数时仍然存在且是上一次出函数的值。#includestdio.hvoidtest(){staticintt0;// 只初始化一次t;printf(%d ,t);}intmain(){test();// 第 1 次调用打印1test();// 第 2 次调用打印2test();// 第 3 次调用打印3return0;}//结果1 2 3static修饰局部变量后改变了变量生命周期本质存储类型改变了。变量无static栈区局部变量函数参数有static静态区全局变量静态变量生命周期变为和程序周期一样了只有程序结束后才会被销毁。作用域不变只能在该函数内使用。4.修饰全局变量在不同源文件中全局变量不能跨文件使用编译器对文件单独从上到下编译故编译不同源文件时不能识别不同文件的全局变量要使用的话需extern声明。但若全局变量被static修饰就无法跨文件使用static表示其只是该文件内部使用的使其只能在本源文件中使用作用域变小。本质原因是全局变量默认是具有外部链接属性的在外部文件中使用时只需适当声明即可但全局变量被static修饰后外部链接属性就变成了内部链接属性只能在自己所在的源文件内部使用其他源文件即使声明也无法正常使用。使用建议如果一个全局变量只想在所在的源文件内部使用不想被其他文件使用就可以使用static修饰。5.修饰函数static修饰函数和全局变量同理若只想在定义该函数的文件中使用可用static放在函数创建时的函数返回值类型前。本质是因为默认函数有外部链接属性使函数在整个工程中只要适当声明就可使用但static修饰后就变成了内部链接属性使函数只能在自己所在的源文件中使用。使用建议一个函数只想爱所在源文件内部使用不想被其他源文件使用就可以用static修饰不想让别人使用 / 与别人的代码发生冲突
返回列表