概述在C语言里static关键字较为常用要是使用得恰当那么能够极大地提升程序的模块化特性这对扩展以及维护是有利的。可是针对c语言刚开始学习的人来讲static鉴于运用起来灵活多变并非轻易就能掌握得住。这篇文章针对static于c语言里的应用状况做出总结以供参考借鉴使用。要是存在差错遗漏的地方还望能够毫不吝啬地给予指出纠正。最后那一节增添了c面向对象里头static的运用特性将其作为拓展阅读内容。在程序中使用static变量1. 局部变量经常与使用者打交道的便是普通局部变量就其所属范围而言只要是在函数内部定义且未添加static修饰符的变量都同属于这一类别。编译器通常不会对普通局部变量予以初始化这意味着在其初始阶段变量的值处于不确定状态除非对其进行明确地赋值操作情况才会有所改变。普通局部变量存储于进程栈空间使用完毕会立即释放。静态局部变量是用static修饰符来进行定义的就算在声明的时候没有赋予初始值编译器也会将它给初始化为0。并且静态局部变量是存储在进程的全局数据区即便函数返回了它的值依旧会维持不变。变量在全局数据区分配内存空间编译器自动对其初始化它的作用范围是局部的那种作用域在定义它的那个函数终止的时候它的作用域就跟着结束了。小程序体会一下静态局部变量的威力#includevoidfn(void){intn10;printf(n%d\n,n);n;printf(n%d\n,n);}voidfn_static(void){staticintn10;printf(static n%d\n,n);n;printf(n%d\n,n);}intmain(void){fn();printf(--------------------\n);fn_static();printf(--------------------\n);fn();printf(--------------------\n);fn_static();return0;}运行结果如下- % ./a.out n10 n11 -------------------- static n10 n11 -------------------- n10 n11 -------------------- static n11 n12可以看出静态局部变量所呈现的效果与全局变量相比有着相似之处然而其是处在函数体的内部这样的情况对于程序的模块化而言就有着极大的有利之处了。2. 全局变量有这样一种情况全局变量它的定义设置是处于函数体的外部区域它会在全局数据区进行存储空间的分配动作并且呢编译器会自动地针对它开展初始化过程。普通全局变量能被整个工程看见别的文件在使用extern外部声明后就能直接拿来用。这意味着别的文件没办法再去定义一个和它名字一样的变量了不然编译器会觉得它们是同一个变量。在一个文件里的静态全局变量仅仅是对于当前这个文件而言才是可见的别的文件是没办法去访问它的而另外的文件呢是能够去定义和它有着相同名字的变量的并且二者之间是不会相互产生影响的。在对不需要与别的文件进行共享的全局变量予以定义之际添加static关键字能够卓有成效地削减程序模块相互之间的耦合防止不同文件当中同名变量产生冲突并且不会出现误用的情况。函数函数的运用方式跟全局变量相像于函数的返回类型前面添加上static的情况即为静态函数。它具备的特性是这样的不是静态的函数能够在另外一个文件里头直接去引用甚至连使用extern声明都不需要。下述两个文件的示例表明运用static声明的函数无法被另一个文件所引用。/* file1.c */#includestaticvoidfun(void){printf(hello from fun.\n);}intmain(void){fun();fun1();return0;}/* file2.c */#includestaticvoidfun1(void){printf(hello from static fun1.\n);}进行使用gcc file1.c file2.c编译这个操作的时候出现的错误报告是这样呈现的/tmp/cc2VMzGR.o在函数‘main’中 static_fun.c:(.text0x20)对‘fun1’未定义的引用 collect2: error: ld returned 1 exit status更改文件不运用static修饰符能够在另外一个文件里引用此函数。/* file1.c */#includevoidfun(void){printf(hello from fun.\n);}/* file2.c */intmain(void){fun();return0;}用同样的方式也就是使用gcc file1.c file2.c来编译编译的过程是通过的运行之后所得到的结果是好像下边说的那般- % ./a.out hello from fun.面向对象静态数据成员在类内数据成员的声明之前添加static关键字如此一来该数据成员便成为类内的静态数据成员其具备如下特点同全局变量相比使用静态数据成员有两个优势静态成员函数跟静态数据成员相类同静态成员函数隶于整个类并非某一个对象它的特性是这样的总结static是个颇具效用的关键字恰当运用能让程序更出色。当然有些公司的编码规范明确规定仅用于本文件的函数都得用static关键字声明这是一种良好的编码风格。不管怎样在实际进行编码的时候都得留意自身的编码习惯尽可能展现出语言自身的优雅以及编码者的编码素养。
C语言static关键字详解:初学者必看的静态变量用法
发布时间:2026/5/17 17:41:48
概述在C语言里static关键字较为常用要是使用得恰当那么能够极大地提升程序的模块化特性这对扩展以及维护是有利的。可是针对c语言刚开始学习的人来讲static鉴于运用起来灵活多变并非轻易就能掌握得住。这篇文章针对static于c语言里的应用状况做出总结以供参考借鉴使用。要是存在差错遗漏的地方还望能够毫不吝啬地给予指出纠正。最后那一节增添了c面向对象里头static的运用特性将其作为拓展阅读内容。在程序中使用static变量1. 局部变量经常与使用者打交道的便是普通局部变量就其所属范围而言只要是在函数内部定义且未添加static修饰符的变量都同属于这一类别。编译器通常不会对普通局部变量予以初始化这意味着在其初始阶段变量的值处于不确定状态除非对其进行明确地赋值操作情况才会有所改变。普通局部变量存储于进程栈空间使用完毕会立即释放。静态局部变量是用static修饰符来进行定义的就算在声明的时候没有赋予初始值编译器也会将它给初始化为0。并且静态局部变量是存储在进程的全局数据区即便函数返回了它的值依旧会维持不变。变量在全局数据区分配内存空间编译器自动对其初始化它的作用范围是局部的那种作用域在定义它的那个函数终止的时候它的作用域就跟着结束了。小程序体会一下静态局部变量的威力#includevoidfn(void){intn10;printf(n%d\n,n);n;printf(n%d\n,n);}voidfn_static(void){staticintn10;printf(static n%d\n,n);n;printf(n%d\n,n);}intmain(void){fn();printf(--------------------\n);fn_static();printf(--------------------\n);fn();printf(--------------------\n);fn_static();return0;}运行结果如下- % ./a.out n10 n11 -------------------- static n10 n11 -------------------- n10 n11 -------------------- static n11 n12可以看出静态局部变量所呈现的效果与全局变量相比有着相似之处然而其是处在函数体的内部这样的情况对于程序的模块化而言就有着极大的有利之处了。2. 全局变量有这样一种情况全局变量它的定义设置是处于函数体的外部区域它会在全局数据区进行存储空间的分配动作并且呢编译器会自动地针对它开展初始化过程。普通全局变量能被整个工程看见别的文件在使用extern外部声明后就能直接拿来用。这意味着别的文件没办法再去定义一个和它名字一样的变量了不然编译器会觉得它们是同一个变量。在一个文件里的静态全局变量仅仅是对于当前这个文件而言才是可见的别的文件是没办法去访问它的而另外的文件呢是能够去定义和它有着相同名字的变量的并且二者之间是不会相互产生影响的。在对不需要与别的文件进行共享的全局变量予以定义之际添加static关键字能够卓有成效地削减程序模块相互之间的耦合防止不同文件当中同名变量产生冲突并且不会出现误用的情况。函数函数的运用方式跟全局变量相像于函数的返回类型前面添加上static的情况即为静态函数。它具备的特性是这样的不是静态的函数能够在另外一个文件里头直接去引用甚至连使用extern声明都不需要。下述两个文件的示例表明运用static声明的函数无法被另一个文件所引用。/* file1.c */#includestaticvoidfun(void){printf(hello from fun.\n);}intmain(void){fun();fun1();return0;}/* file2.c */#includestaticvoidfun1(void){printf(hello from static fun1.\n);}进行使用gcc file1.c file2.c编译这个操作的时候出现的错误报告是这样呈现的/tmp/cc2VMzGR.o在函数‘main’中 static_fun.c:(.text0x20)对‘fun1’未定义的引用 collect2: error: ld returned 1 exit status更改文件不运用static修饰符能够在另外一个文件里引用此函数。/* file1.c */#includevoidfun(void){printf(hello from fun.\n);}/* file2.c */intmain(void){fun();return0;}用同样的方式也就是使用gcc file1.c file2.c来编译编译的过程是通过的运行之后所得到的结果是好像下边说的那般- % ./a.out hello from fun.面向对象静态数据成员在类内数据成员的声明之前添加static关键字如此一来该数据成员便成为类内的静态数据成员其具备如下特点同全局变量相比使用静态数据成员有两个优势静态成员函数跟静态数据成员相类同静态成员函数隶于整个类并非某一个对象它的特性是这样的总结static是个颇具效用的关键字恰当运用能让程序更出色。当然有些公司的编码规范明确规定仅用于本文件的函数都得用static关键字声明这是一种良好的编码风格。不管怎样在实际进行编码的时候都得留意自身的编码习惯尽可能展现出语言自身的优雅以及编码者的编码素养。