c语言中static的作用(精辟分析)
- 格式:doc
- 大小:31.50 KB
- 文档页数:3
static在C中的用法在C语言中,static是一个关键字,用于修饰变量、函数和块作用域。
它可以改变它所修饰实体的生命周期、作用域和可见性。
本文将介绍static关键字在C语言中的多种用法。
1. 静态变量使用static关键字修饰的变量被称为静态变量(Static Variables)。
静态变量具有以下特点:•静态变量存储在静态数据区,不随函数调用结束而销毁;•静态变量的作用域局限于定义它的代码块;•静态变量只能被初始化一次,在整个程序运行期间保持其值。
下面是一个示例,展示了静态变量的使用:#include <stdio.h>void increment() {static int count = 0; // 静态变量countcount++;printf("Count: %d\n", count);}int main() {increment(); // 输出:Count: 1increment(); // 输出:Count: 2increment(); // 输出:Count: 3return 0;}在上述示例中,函数increment()内部定义了一个静态变量count。
每次调用该函数时,count会自增,并输出当前值。
由于静态变量的生命周期不受函数调用的影响,所以每次调用increment()时,count的值都会被保留。
2. 静态函数使用static关键字修饰的函数被称为静态函数(Static Functions)。
静态函数具有以下特点:•静态函数只在定义它的源文件中可见,不能被其他源文件调用;•静态函数不能被其他源文件通过函数指针调用;•静态函数不会与其他源文件中同名的全局函数产生冲突。
下面是一个示例,展示了静态函数的使用:#include <stdio.h>static void printMessage() {printf("This is a static function.\n");}int main() {printMessage(); // 正常调用静态函数return 0;}在上述示例中,我们定义了一个静态函数printMessage()。
static用法
static 是 C 语言和 C++ 语言中的一种修饰符,用它修饰的变量或者函数就具有一定的特性,它有以下几种用法:
1. static 修饰全局变量:全局变量被声明为 static 类型后,就只能在声明它的文件里使用,其它文件里不能使用它。
2. static 修饰局部变量:在函数体内,声明变量为 static 类型的话,就变成了静态变量,其值会一直保存,直到程序结束才会释放,但是它的作用域(可以访问的范围)仍然为定义它的函数内部。
3. static 修饰函数:函数被声明为静态的意思是它仅能在本文件中被调用,函数被声明为静态,可以节省空间,不会放入到全局表中去。
4. static 修饰类成员:声明类成员变量为 static 类型,意味着每一个该类对象都会共用一个公共的变量。
总而言之,static 可以将变量和函数的作用域范围限定在声明它们的文件中,减少各个文件之间的调用,使程序更有效率。
c语言static的用法举例在C语言中,关键字static可用于不同的上下文中,其主要功能有以下三种:1.在函数内部声明的静态变量:在函数内部声明的变量通常是局部变量,其作用域仅限于函数内部。
但是,如果我们在局部变量前加上关键字static,则该变量将成为静态变量,并将其作用域扩展到整个函数的生命周期内。
静态变量的存储空间将在程序启动时分配,并在程序终止时释放。
静态变量的初始值默认为0。
例如:```c#include <stdio.h>void count() {static int num = 0; //静态变量num++;printf("num = %d\n", num);}int main() {count(); //输出:num = 1count(); //输出:num = 2count(); //输出:num = 3return 0;}```在上面的例子中,函数count内部的变量num是一个静态变量。
每次调用count函数时,num的值都会自增,并且num的值在多次调用之间会被保留下来。
2.在文件内部声明的静态变量:在文件内部声明的变量通常是全局变量,其作用域为整个文件,不能被其他文件所访问。
但是,如果我们在全局变量前加上关键字static,则该变量将变为静态全局变量,作用域仍限制在文件内部。
静态全局变量的生命周期与整个程序的运行周期相同。
例如:```c#include <stdio.h>static int count = 0; //静态全局变量void increment() {count++;}int main() {increment();increment();printf("count = %d\n", count); //输出:count = 2return 0;}```在上面的例子中,全局变量count被声明为静态变量,因此它只能在所在的文件中访问。
static函数在c语言中的用法在C语言中,静态函数(static function)是指在函数声明前加上static关键字的函数。
静态函数与非静态函数的主要区别在于,静态函数只能在声明所在的源文件中访问,不能被其他源文件调用。
以下是静态函数的用法和一些适当的拓展:1.限制函数的作用域:将函数声明为静态可以限制其只在当前文件中使用。
这样可以避免函数被其他文件中的函数或变量误用,提高代码安全性和可维护性。
2.可以避免与其他文件中相同名称的函数产生冲突:当不同文件中定义了相同名称的函数时,编译器会报错。
使用静态函数可以避免这种冲突,因为它们只在当前文件中可见。
3.减小程序的内存占用:静态函数只在声明所在的源文件中可见,其他文件无法调用。
因此,编译器在编译其他文件时不会为静态函数分配内存空间,从而减小了程序的内存占用。
4.提高函数的执行效率:由于静态函数只在当前文件中使用,编译器可以对其进行优化。
在调用静态函数时,编译器可以直接生成机器码,而不需要通过函数指针等操作,从而提高函数的执行效率。
5.提供私有函数接口:静态函数只能在当前文件中使用,对其他文件隐藏了函数的具体实现。
这样可以实现一些私有函数接口,仅供当前文件中的函数调用,增加了代码的封装性。
需要注意的是,静态函数仍然需要通过函数原型进行声明和定义,以便编译器正确解析函数调用和参数传递。
静态函数的定义可以在函数声明前或后,但必须在调用之前。
总结:静态函数在C语言中主要用于限制函数的作用域、避免函数冲突、减小内存占用、提高执行效率和提供私有函数接口等方面。
static在类中的用法
在Java、C++等编程语言中,static是静态的意思,它可以修饰成员变量、成员方法以及代码块。
以下是static在类中的主要用法:
1. static成员变量:
- 静态成员变量在类加载时就已经存在,并且只被初始化一次。
- 静态成员变量独立于类的任何对象,所有对象共享同一个静态成员变量。
- 静态成员变量可以在类的外部直接访问,无需创建类对象。
2. static成员方法:
- 静态成员方法不依赖于对象,可以直接通过类名调用。
- 静态成员方法不能访问非静态成员变量和非静态方法,但可以访问静态成员变量和静态方法。
- 静态成员方法在类加载时就已经准备完成,无需创建对象。
3. static代码块:
- static代码块在类加载时自动执行,用于初始化静态成员变量或执行其他静态操作。
- static代码块只执行一次,除非手动修改静态变量或重新加载类。
总结:static在类中主要用于定义静态成员(变量、方法、代码块),这些静态成员在类加载时就已经存在,并独立于类的对象。
它们可以方便地在不创建对象的情况下进行访问和操作,提高了代码的可读性和可维护性。
static函数在c语言中的用法-回复static函数在C语言中的用法C语言是一种面向过程的编程语言,具有高效、灵活和可移植等特点。
在C语言中,static是一种修饰符,可用于变量、函数和数据类型,用于改变它们的存储类别、作用域和生命周期。
本文将重点讨论static修饰函数的用法及其相关特性。
一、static函数的基本概念在C语言中,函数默认的存储类别是extern,即函数是全局可见的。
然而,通过使用static修饰函数,我们可以使其具有静态存储类别。
静态函数的作用域被限制在定义它的源文件中,即在该源文件之外是不可见的,这使得我们可以更好地控制函数的可访问性,提高代码的模块化和封装性。
二、static函数的特点1. 局部作用域:static函数的作用域仅限于定义它的源文件中,其它源文件无法访问该函数,即使使用了extern关键字也不行。
这种封装性有助于避免函数被无关的代码调用或修改,提高代码的可维护性。
2. 静态生命周期:static函数的生命周期与整个程序的执行时间一样长,即使在函数执行完毕后,其占用的内存空间仍然被保留。
这意味着该函数的局部变量(包括静态局部变量)也会保持其值,而不像普通函数中的局部变量那样,在函数执行结束后被释放。
3. 隐藏函数接口:将函数声明为static后,该函数就成为了一个私有函数,只有在同一个源文件中才能够调用。
这种隐藏函数接口可以有效防止函数被误用或滥用,提高代码的安全性。
4. 函数重名:static函数可以与另一个源文件中的函数同名而不冲突,这是因为它们位于不同的作用域中。
这种灵活性允许我们在不同的源文件中定义相同名字的函数,而不必担心命名冲突的问题。
三、static函数的用途1. 辅助函数:在一个源文件中,一个函数可能需要调用另一个函数来完成特定的任务。
如果这两个函数只会在该文件中使用,那么可以将被调用的函数声明为static,以避免冲突和混淆。
2. 模块化编程:当我们将一个大型程序分解为多个源文件时,可以使用static函数隐藏不必要的细节,提高程序的可读性和可维护性。
1 关键字static的作用是什么?这个简单的问题很少有人能回答完全。
在C语言中,关键字static有三个明显的作用:1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。
它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。
那就是,这个函数被限制在声明它的模块的本地范围内使用。
2 关键字const有什么含意?我只要一听到被面试者说:"const意味着常数",我就知道我正在和一个业余者打交道。
去年Dan Saks已经在他的文章里完全概括了const的所有用法,因此ESP(译者:Embedded Systems Programming)的每一位读者应该非常熟悉const能做什么和不能做什么.如果你从没有读到那篇文章,只要能说出const意味着"只读"就可以了。
尽管这个答案不是完全的答案,但我接受它作为一个正确的答案。
(如果你想知道更详细的答案,仔细读一下Saks的文章吧。
)如果应试者能正确回答这个问题,我将问他一个附加的问题:下面的声明都是什么意思?const int a;int const a;const int *a;int * const a;int const * a const;/******/前两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。
第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。
最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
如果应试者能正确回答这些问题,那么他就给我留下了一个好印象。
顺带提一句,也许你可能会问,即使不用关键字const,也还是能很容易写出功能正确的程序,那么我为什么还要如此看重关键字const呢?我也如下的几下理由:1) 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
在C语言中,static关键字用于修饰函数或变量,表示它们的作用域仅限于当前源文件。
换句话说,它们是静态的,不会在其他源文件中被外部链接。
对于函数来说,如果一个函数被声明为static,那么它只在其所在的源文件中可见,不能在其他源文件中被调用。
这种限制有助于将函数的作用域限制在一定范围内,保护函数的代码和数据不被其他源文件干扰。
对于变量来说,如果一个变量被声明为static,那么它的生命周期被延长至程序的整个运行期间,而不仅仅是在其所在的函数执行期间。
这意味着,即使在函数调用结束后,该变量仍然存在,可以在下次函数调用时使用。
这种特性使得static变量常用于保存某些全局状态或跨多个函数间共享数据。
总的来说,static关键字在C语言中用于控制函数和变量的可见性和生命周期,有助于编写更加安全、可靠的代码。
c语言中static的定义
static是一种在C语言中使用的关键字,用于声明静态变量或函数。
它的作用是限制变量或函数的作用域,使其只能在声明它们的文件中可见,无法被其他文件访问。
静态变量是一种只在声明它的函数或文件中可见的变量。
与普通变量不同,静态变量在程序执行期间只会被初始化一次,并且在函数调用结束后也不会被销毁,而是保留其值供下一次调用使用。
这使得静态变量在函数调用之间保持了状态,可以用于在多次函数调用中共享数据。
静态函数是一种只在声明它的文件中可见的函数。
与普通函数不同,静态函数无法被其他文件调用,只能在本文件中使用。
这种限制可以有效地隐藏实现细节,提高代码的安全性和可维护性。
使用static关键字可以有效地控制变量和函数的作用域,避免命名冲突和意外访问。
静态变量的持久性和静态函数的封装性使得它们在模块化编程中发挥重要作用。
在C语言中,static的使用场景非常广泛。
例如,在多个文件中定义同名的全局变量时,可以使用static关键字限制其作用域,避免冲突。
另外,在编写库文件时,可以使用static关键字将一些内部函数和变量隐藏起来,只暴露必要的接口,提高代码的安全性和可维护性。
总结一下,static是C语言中的一个关键字,用于声明静态变量和静态函数,限制其作用域,使其只能在本文件中可见。
它具有保持变量状态和隐藏实现细节的功能,对于模块化编程和库文件的编写非常有用。
通过合理使用static关键字,可以提高代码的可读性、安全性和可维护性。
c语言static 的三个作用static是C语言中的关键字,常用于定义变量和函数。
它有三个主要的作用:作用域限定、生命周期延长和隐藏实现。
一、作用域限定:1.1局部变量的作用域限定:在函数内部使用static修饰的局部变量,使其只能在定义它的函数内部使用,不能被其他函数访问。
这样可以避免在不同函数中使用相同名称的变量造成的冲突。
1.2函数的作用域限定:在函数外部使用static修饰的函数,使其只能在本文件内部使用,不能被其他文件调用。
这主要用于隐藏一些辅助性的函数,提高程序的安全性和模块化程度。
二、生命周期延长:2.1局部变量的生命周期延长:使用static修饰的局部变量,在程序运行时一直存在,不会随着函数执行结束而销毁,直到程序结束才会被销毁。
这样可以在多次调用函数时保持变量的值不变,起到记忆的作用。
2.2全局变量的生命周期延长:使用static修饰的全局变量,生命周期同样延长到整个程序运行期间。
这样可以在不同的函数中共享同一个全局变量,达到数据共享的目的。
三、隐藏实现:使用static修饰的变量和函数,其作用域被限定在本文件内部,其他文件无法直接使用和访问,从而隐藏了其具体的实现细节。
这样可以提高程序的安全性和可维护性,使得代码更加模块化。
下面进一步解释每个作用:1.作用域限定:1.1局部变量的作用域限定在函数内部使用static修饰局部变量,该变量只能在定义它的函数内部使用,无法在其他函数中使用。
这种限制避免了在不同的函数中多次声明相同名称的变量带来的冲突。
同时,static修饰的局部变量在函数执行完毕后并不销毁,而是保留其值,下次再次调用该函数时,仍能使用先前存储的值。
比如:```cvoid func() {static int count = 0;count++;printf("%d\n", count);}```在上面的例子中,count是一个静态局部变量,每次调用func函数时,count的值会自增并输出。
C语言中static的作用说明:以下所有代码测试均在VC++6.0中完成。
(1) static主要作用是隐藏test1.c代码如下:sub.c代码如下:程序运行输出结果为图1:图1 test1.c运行结果在sub.c中定义的全局变量a和函数msg在test1.c中能够使用。
这是因为所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。
此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件test1.c是可见的。
将sub.c代码如下所示:Build工程时出现如下错误,如图2:图2 使用静态全局变量时Link错误在变量a和函数msg的定义前加上static,就会对其它源文件隐藏。
test1.c 就看不到它们了。
这是static的重要特性,当工程较大时,由不同的程序员来编程,可能出现函数重名,引起不必要的错误。
利用static就可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
注意:静态全局变量和普通全局变量均存储在静态存储空间,只是static 改变了作用域。
(2)静态局部变量的赋值对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。
以后每次调用函数时不再重新赋值而只是保留上次函数调用结束时的值。
而对自动变量,不是在编译时进行的,而是在函数调用时进行,每调用一次函数重新给一次初值,相当于执行一次赋值语句。
体会下面例子。
执行结果如下图3所示:图3 静态局部变量和自动变量输出结果比较(3)Static变量的默认值内存供给用户的存储空间:(1)程序区(2)静态存储区(3)动态存储区。
运行结果如图4:图4 静态局部变量和自动变量默认值比较提示:变量a在静态存储区,变量b在动态存储区。
主要参考文献:C程序设计语言(第二版) Brian W.Kernighan Dennis M.Ritchie 著徐宝文李志译 4.6节静态变量C程序设计(第三版) 谭浩强8.9节变量的存储类型。
c语言中static关键字用法详解https:///guotianqing/article/details/79828100 概述static关键字在c语言中比较常用,使用恰当能够大大提高程序的模块化特性,有利于扩展和维护。
但是对于c语言初学者,static由于使用灵活,并不容易掌握。
本文就static在c语言中的应用进行总结,供参考使用。
错漏之处,请不吝指正。
在程序中使用static变量1. 局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。
编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。
普通局部变量存储于进程栈空间,使用完毕会立即释放。
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。
且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。
变量在全局数据区分配内存空间;编译器自动对其初始化其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束小程序体会一下静态局部变量的威力:#include <stdio.h>void fn(void){int n = 10;printf("n=%d\n", n);n++;printf("n++=%d\n", n);}void fn_static(void){static int n = 10;printf("static n=%d\n", n);n++;printf("n++=%d\n", n);}int main(void){fn();printf("--------------------\n"); fn_static();printf("--------------------\n"); fn();printf("--------------------\n"); fn_static();return 0;}运行结果如下:-> % ./a.outn=10n++=11--------------------static n=10n++=11--------------------n=10n++=11--------------------static n=11n++=12可见,静态局部变量的效果跟全局变量有一拼,但是位于函数体内部,就极有利于程序的模块化了。
c语言的static方法Static方法是在C语言中一个非常重要的概念。
它是一种在函数或变量前加上static关键字定义的方法,用于限制函数或变量的作用域。
本文将对static方法进行详细介绍,包括其定义、作用、使用场景等方面进行探讨。
我们来看一下static方法的定义。
在C语言中,static方法可以用于定义函数或变量。
对于函数而言,static关键字将函数的作用域限制在当前文件中,使其只能在当前文件中被调用,而不能被其他文件调用。
对于变量而言,static关键字将变量的作用域限制在当前函数中,使其只能在当前函数中被访问,而不能在其他函数中被访问。
接下来,我们来探讨一下static方法的作用。
首先,static方法可以起到隐藏函数或变量的作用。
由于static方法的作用域限制在当前文件或函数中,其他文件或函数无法直接访问到这些static方法,从而起到了隐藏的作用。
其次,static方法可以避免命名冲突。
在大型项目中,可能会存在多个文件或函数,如果不使用static方法来限制作用域,很容易出现命名冲突的情况,从而导致程序出错。
而使用static方法可以有效避免这个问题。
最后,static方法可以提高程序的运行效率。
由于static方法的作用域限制在当前文件或函数中,编译器可以对其进行优化,从而提高程序的运行效率。
在实际的编程中,static方法有许多使用场景。
首先,当我们需要在一个文件中定义一些只能在该文件中使用的函数或变量时,可以使用static方法。
这样可以有效地将这些函数或变量与其他文件中的函数或变量进行隔离,提高代码的可维护性。
其次,当我们需要在一个函数中定义一些只能在该函数中使用的变量时,可以使用static方法。
这样可以避免这些变量被其他函数访问到,从而增加程序的安全性。
此外,static方法还可以用于实现单例模式。
在单例模式中,只允许存在一个实例对象,通过使用static方法可以实现对单例对象的控制。
static变量的作⽤在C语⾔中,关键字static的意思是静态的,有3个明显的作⽤:1. 在函数体内,静态变量具有记忆作⽤,即⼀个被声明为静态的变量在这⼀函数被调⽤的过程中其值维持不变。
2. 在模块内(但在函数体外),它的作⽤域范围是有限制的,如果⼀个变量被声明为静态的,那么该变量可以被模块内所有的函数访问,但不能被模块外的其他函数访问。
3. 内部函数应该在当前源⽂件中说明和定义,对于可在当前源⽂件以外使⽤的函数,应该在⼀个头⽂件中说明,使⽤这些函数的源⽂件要包含这个头⽂件。
static全局变量和普通全局变量的区别:static全局变量只初始化⼀次,这是为了防⽌它在其他⽂件单元中引⽤。
static局部变量和普通局部变量的区别:static局部变量只初始化⼀次,下次的运算依据是上⼀次的结果值。
static函数与普通函数的区别在与作⽤域不⼀样,static()函数只在⼀个源⽂件中有效,不能被其它源⽂件使⽤。
静态数据成员的特点:1. 对于⾮静态数据成员,每个类都有⾃⼰的复制品。
⽽静态数据成员被当做是类的成员。
⽆论这个类的对象被定义了多少个,静态数据成员在程序中也只有⼀份复制品,由该类型的所有对象共享访问。
2. 静态数据成员存储在全局数据区。
定义时要分配空间,所以不能在类声明中定义。
由于静态数据成员属于本类的所有对象共享,所以他不属于特的类对象,在没有产⽣类对象时,其作⽤域就可见,即在没有产⽣类的实例时,程序员也可以使⽤它。
3. 静态数据成员也遵从public、protect、private访问规则。
4. static成员变量的初始化在类外,此时不能再带上static的关键字。
private、protect的static成员虽然可以在类外初始化,但是不能在类外被访问。
静态数据成员的优势:1. 静态数据成员没有进⼊程序的全局名字空间,因此不存在与程序中其他全局名字冲突的可能性。
2.可以实现信息隐藏。
静态数据成员可以使private成员,⽽全局变量不能。
静态关键字在C语言中的用法一、引言在C语言中,static关键字是一个非常重要的概念。
它可以用于定义静态变量、函数和限制变量的作用域。
静态关键字在C语言中有着广泛的用法,它不仅可以帮助我们控制变量的生命周期,还可以提高程序的安全性和可读性。
本文将从静态变量、静态函数和作用域的角度,深入探讨static关键字在C语言中的用法。
二、静态变量在C语言中,静态变量是指在函数内部定义的变量,但其作用域仅限于定义它的函数内部,即只能在定义它的函数内部访问。
与普通的局部变量不同的是,静态变量在程序运行期间只会被初始化一次,在整个程序运行过程中,静态变量的值都会被保留。
这使得静态变量成为了一个非常适合用来记录状态或者计数的工具。
另外,静态变量的作用域仅限于定义它的函数内部,这就意味着即使在不同的函数中定义了同名的静态变量,它们也互相独立,不会相互影响。
静态变量不仅可以帮助我们在函数调用之间保持状态的连续性,还可以限制其他函数对其的访问,提高程序的安全性。
三、静态函数除了定义静态变量,static关键字还可以用于定义静态函数。
静态函数和静态变量类似,也是只能在定义它的文件中使用的函数。
使用static关键字来限制函数的作用域,可以有效地防止函数被其他文件中的函数调用,提高了程序的安全性。
静态函数还可以使得代码更加模块化,使得程序的结构更加清晰。
在大型项目中,静态函数的使用可以帮助我们更好地管理代码,提高代码的可维护性和可读性。
四、作用域在C语言中,作用域是一个非常重要的概念。
使用static关键字可以改变变量或函数的作用域,使得它们只能在定义它们的文件中使用。
这对于控制程序的结构和组织具有非常重要的意义。
静态变量和静态函数的作用域仅限于定义它们的文件内部,这使得我们可以更加灵活地组织程序的结构,减少了不同部分之间的耦合,提高了程序的可维护性。
另外,通过改变变量和函数的作用域,我们还可以隐藏一些实现细节,使得程序更加安全和健壮。
static的作用在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
为理解这句话,我举例来说明。
我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容char a = 'A'; // global variablevoid msg(){printf("Hello\n");}下面是main.c的内容int m ain(void){extern char a; // extern variable must be declared before useprintf("%c ", a);(void)m sg();return 0;}程序的运行结果是:A Hello你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。
此例中,a是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏。
例如在a和msg的定义前加上static,m ain.c就看不到它们了。
利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。
存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,stati c可以控制变量的可见范围,说到底static还是用来隐藏的。
static的作用(精辟分析)
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。
(1)先来介绍它的第一条也是最重要的一条:隐藏。
当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。
为理解这句话,我举例来说明。
我们要同时编译两个源文件,一个是a.c,另一个是main.c。
下面是a.c的内容
char a = 'A'; // global variable
void msg()
{
printf("Hello\n");
}
下面是main.c的内容
int main(void)
{
extern char a; // extern variable must be declared before use
printf("%c ", a);
(void)msg();
return 0;
}
程序的运行结果是:
A Hello
你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。
此例中,a 是全局变量,msg是函数,并且都没有加static前缀,因此对于另外的源文件main.c是可见的。
如果加了static,就会对其它源文件隐藏。
例如在a和msg的定义前加上static,main.c就看不到它们了。
利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。
Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。
(2)static的第二个作用是保持变量内容的持久。
存储在静态数据区的变
量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。
虽然这种用法不常见,但我还是举一个例子。
#include <stdio.h>
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
程序的运行结果是:
global local static
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
(3)static的第三个作用是默认初始化为0。
其实全局变量也具备这一属性,因为全局变量也存储在静态数据区。
在静态数据区,内存中所有的字节默认值都是0x00,某些时候这一特点可以减少程序员的工作量。
比如初始化一个稀疏矩阵,我们可以一个一个地把所有元素都置0,然后把不是0的几个元素赋值。
如果定义成静态的,就省去了一开始置0的操作。
再比如要把一个字符数组当字符串来用,但又觉得每次在字符数组末尾加’\0’太麻烦。
如果把字符串定义成静态的,就省去了这个麻烦,因为那里本来就是’\0’。
不妨做个小实验验证一下。
#include <stdio.h>
int a;
int main(void)
{
int i;
static char str[10];
printf("integer: %d; string: (begin)%s(end)", a, str);
return 0;
}
程序的运行结果如下
integer: 0; string: (begin)(end)
最后对static的三条作用做一句话总结。
首先static的最主要功能是隐藏,其次因为static 变量存放在静态存储区,所以它具备持久性和默认值0。