static 函数和变量 (转载)

转载 2007年09月22日 09:41:00

毕业一年了,为了项目写过一些程序,只为了满足系统功能,拼拼凑凑 的完成了 ,现在回想起来,对许多的程序没有进行优化,同时,也感到一些基础的语法知识理解不清楚, 因此,在此记录一些网上找到的文章,同时,非常的感谢转载文章的作者,感谢他们对各种语法知识的讲解与总结,谢谢.

以下文章,介绍的是static 函数和变量,原文出处:(http://blog.csdn.net/norbe/archive/2006/04/07/654433.aspx)

static
声明的变量在C语言中有两方面的特征:
  1)、变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值。这一点是它与堆栈变量和堆变量的区别。
  2)、变量用static告知编译器,自己仅仅在变量的作用范围内可见。这一点是它与全局变量的区别。
Tips:
  A.若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
  B.若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
  C.设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
  D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)
  E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

 

函数前加static使得函数成为静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件(所以又称内部函数)。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。

扩展分析:术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static
在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,
C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相
同)。

文章2:(http://my.donews.com/ben2/2006/02/28/c%E8%AF%AD%E8%A8%80%E4%B8%ADstatic-%E5%8F%98%E9%87%8F/)

1.  static 变量

静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

2. 静态局部变量
静态局部变量属于静态存储方式,它具有以下特点:
(1)静态局部变量在函数内定义  它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

(2)允许对构造类静态局部量赋初值  例如数组,若未赋以初值,则由系统自动赋以0值。
(3)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以 看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的 值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成 意外的副作用,因此仍以采用局部静态变量为宜。

3.静态全局变量
全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局 变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在 定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此 可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

4. static 函数…..

内部函数和外部函数

当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。
1 内部函数(又称静态函数)
如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。
定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
static  函数类型  函数名(函数参数表)
{……}
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。
使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

2 外部函数
外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
[extern]  函数类型  函数名(函数参数表)
{……}
调用外部函数时,需要对其进行说明:
[extern]  函数类型  函数名(参数类型表)[,函数名2(参数类型表2)……];

[案例]外部函数应用。
(1)文件mainf.c
main()
{  extern void input(…),process(…),output(…);
input(…);  process(…);  output(…);
}

(2)文件subf1.c
……
extern  void input(……)                           /*定义外部函数*/
{……}
(3)文件subf2.c
……
extern  void process(……)                     /*定义外部 函数*/
{……}
(4)文件subf3.c
……
extern void output(……)                        /*定义外部函数*/
{……}

还有篇文章,请参考 (http://www.ieee.org.cn/dispbbs.asp?boardID=61&ID=36570)

相关文章推荐

static变量和static函数的用法摘抄

  • 2010年08月04日 08:40
  • 29KB
  • 下载

static成员函数成员变量

再一次吐槽一下,c++这门语言实在是太复杂了,语法规则这么多,关于static,还是有很多需要注意的地方,总结一下吧: 首先,我们知道在c中,static的作用可以用来改变变量的生存期和作用域,函数的...
  • zpxly
  • zpxly
  • 2013年09月14日 10:28
  • 894

static 成员函数及变量整理

1.static成员的所有者是类本身和对象,但是多有对象拥有一样的静态成员。从而在定义对象是不能通过构造函数对其进行初始化。 2.静态成员不能在类定义里边初始化,只能在class body外初始化。...

static变量在Main函数之前执行

一、例1 c/c++语言中,在执行main的入口函数之前,是会首先执行一段代码。 而对于全局变量和static的初始化就是 在main函数之前执行的,例子如下: [c...
  • ThugKd
  • ThugKd
  • 2015年07月06日 17:11
  • 169

static修饰的变量与函数说明

static变量和static函数 static关键字有两种意思 1,表示变量是静态存储变量  表示变量存放在静态存储区.  2,表示该变量是内部连接  (这种情况是指该变量不在任何{}之内,就象全...

java static成员变量和成员函数

static成员变量 希望该类所有的对象共享同一个成员。此时就是 static 大显身手的时候了!! Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对...

static作用(修饰函数、局部变量、全局变量)

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

static修饰的变量及函数

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

C++类的const, static 和inline成员函数(变量)

在C++类的声明中包含多个函数或变量的声明或定义。这些函数和变量可以分为以下几类,这几类并不是完全没有交集的,常量成员函数可以是内联成员函数,内联成员函数也可以是常量成员函数: 普通成员函数和变量 ...

关于static函数的用法和全局变量在工程中的引用

就像我们熟知的那样,变量可以分全局的和局部的,函数也可以分全局的和局部的。比如说,在一个工程的common.h中定义了一个全局变量 int test;那么在整个工程的作用范围内,该变量都是存在的,在编...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:static 函数和变量 (转载)
举报原因:
原因补充:

(最多只允许输入30个字)