c语言中static 函数和普通函数的区别?

xiaobaiwen 2010-12-21 10:35:13
C语言中static 函数除了不能再外部被调用外和普通函数还有什么区别呢?
能不能举个具体的例子出来说明一下?
...全文
90445 45 打赏 收藏 举报
写回复
45 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xingchuan1227 2013-08-27
7楼好强大!学习了!
  • 打赏
  • 举报
回复
zhudl1234 2013-08-27
引用 41 楼 bmwvvvv 的回复:
linux-2.6.38/drivers/dma/amba-pl08x.c 这个函数定义了之后,只是作为一个函数入口: 这样算是调用吗? 这个函数的参数是怎样传进去的,在这个文件里我没有找到这个函数的两个实参:struct amba_device *和struct amba_id *,因为除了上面的结构体赋值,根本就没有这个函数调用的实例请了解的介绍一下,谢谢!
这不是函数指针赋值么?这不是调用,只是将.probe函数实例化为p108x_probe,具体的调用不在驱动中,是在应用程序中调用统一的probe()接口,这时候才传递具体的参数,希望对你有用。
  • 打赏
  • 举报
回复
xiandaoshen 2013-08-09
学习了
  • 打赏
  • 举报
回复
fxlnx 2013-07-31
看到回复我能不能吐槽下,跟普通的函数比仅仅是限制了作用域而已,23楼好样的,说出了我的心声。
  • 打赏
  • 举报
回复
lucmaa 2013-07-24
linux-2.6.38/drivers/dma/amba-pl08x.c

这个函数定义了之后,只是作为一个函数入口:

这样算是调用吗?
这个函数的参数是怎样传进去的,在这个文件里我没有找到这个函数的两个实参:struct amba_device *和struct amba_id *,因为除了上面的结构体赋值,根本就没有这个函数调用的实例请了解的介绍一下,谢谢!

  • 打赏
  • 举报
回复
dreamer001 2013-07-17
论坛中需要7楼那样的高人.
  • 打赏
  • 举报
回复
qd_kun 2013-06-04
围观大神级回复
  • 打赏
  • 举报
回复
oscarpanpan 2013-04-24
7楼说的好
  • 打赏
  • 举报
回复
末日逐风 2013-04-05
7楼有错,函数的代码是放在代码段的好不好啊,进栈出栈只是对于函数执行时的非静态局部变量以及参数来说的,静态函数执行时和普通函数一样,通过地址(在代码段)找到函数的入口,然后读指令,然后执行指令,要不要出栈入栈就看具体的代码了。
  • 打赏
  • 举报
回复
yangyucaca123456 2013-01-07
23楼 我试试 貌似正解
  • 打赏
  • 举报
回复
xokai 2012-09-25
顶23
  • 打赏
  • 举报
回复
liubing303 2012-08-10
同意23楼的观点呢,可能早些的编译器才会有这样的区别,现在的应该没有吧 ,本人用VC6.0做了测试,好像没有区别呢
  • 打赏
  • 举报
回复
brk1985 2012-08-01
[Quote=引用 7 楼 的回复:]
你们这么回答楼主,是很不负责的,既然楼主问了这样的问题,我估计不是很明白static那么我给你从C程序开始讲起:
C程序一直由下列部分组成:
1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;
2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。
3)非初始化数据段(bss段)—……
[/Quote]

这段总结的很好.........................
  • 打赏
  • 举报
回复
du_yang 2012-06-28
23楼是高手啊!!!
  • 打赏
  • 举报
回复
wangna7891 2011-11-22
7楼8楼真好。学到了,不错
  • 打赏
  • 举报
回复
wangchuan3533 2011-08-10
首先顶一下7楼,讲的很详细
我在这里再介绍下static函数其他的好处,就是便于优化。
当函数使用static修饰时,如果使用了-o3 -pm -op2这些编译选项,编译器就知道这个函数只能在本文件范围内调用,就可以采用一些针对这种局部函数的优化策略,比如循环展开之类的,这种优化在具有并行处理能力的处理器(比如DSP)上运行很快。
  • 打赏
  • 举报
回复
hrx1989 2011-03-08
T001真的很给力呀。
论坛中喜欢有更多的英雄!
  • 打赏
  • 举报
回复
wasx1 2010-12-22
嗯,向楼上的学习了
  • 打赏
  • 举报
回复
T0Ols 2010-12-22
给你总结一下,用记事本记下这些,以免以后忘记:
 C语言中使用静态函数的好处:
静态函数会被自动分配在一个一直使用的存储区,直到退出应用程序实例,避免了调用函数时压栈出栈,速度快很多。
关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。
c语言中static的语义1.static变量:1).局部a.静态局部变量在函数内定义,生存期为整个源程序,但作用域与自动变量相同,只能在定义该变量的函数内使用。退出该函数后, 尽管该变量还继续存在,但不能使用它。b.对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。2).全局全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。2.static函数(也叫内部函数)只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用。区别于一般的非静态函数(外部函数) static在c里面可以用来修饰变量,也可以用来修饰函数。 先看用来修饰变量的时候。变量在c里面可分为存在全局数据区、栈和堆里。其实我们平时所说的堆栈是栈而不包含对,不要弄混。
  • 打赏
  • 举报
回复
T0Ols 2010-12-22
你们这么回答楼主,是很不负责的,既然楼主问了这样的问题,我估计不是很明白static那么我给你从C程序开始讲起:
C程序一直由下列部分组成:
      1)正文段——CPU执行的机器指令部分;一个程序只有一个副本;只读,防止程序由于意外事故而修改自身指令;    
  2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放在这里。    
  3)非初始化数据段(bss段)——在程序中没有初始化的全局变量;内核将此段初始化为0。     
  4)栈——增长方向:自顶向下增长;自动变量以及每次函数调用时所需要保存的信息(返回地址;环境信息)。      
5)堆——动态存储分。

全局变量之前加上关键字static,全局变量就被定义成为一个全局静态变量。
   1)内存中的位置:静态存储区(静态存储区在整个程序运行期间都存在)
2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
   3)作用域:全局静态变量在声明他的文件之外是不可见的。准确地讲从定义之处开始到文件结尾。

好处:
定义全局静态变量的好处:
<1>不会被其他文件所访问,修改
<2>其他文件中可以使用相同名字的变量,不会发生冲突。

局部静态变量
在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。
  1)内存中的位置:静态存储区
  2)初始化:未经初始化的全局静态变量会被程序自动初始化为0(自动对象的值是任意的,除非他被显示初始化)
  3)作用域:作用域仍为局部作用域,当定义它的函数或者语句块结束的时候,作用域随之结束。

 注:当static用来修饰局部变量的时候,它就改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。但是局部静态变量在离开作用域之后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对他进行访问。
当static用来修饰全局变量的时候,它就改变了全局变量的作用域(在声明他的文件之外是不可见的),但是没有改变它的存放位置,还是在静态存储区中。

3. 静态函数
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。
  函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。
关键字extern和static用来说明具有静态存储期的变量和函数。用static声明的局部变量具有静态存储持续期(static storage duration),或静态范围(static extent)。虽然他的值在函数调用之间保持有效,但是其名字的可视性仍限制在其局部域内。静态局部对象在程序执行到该对象的声明处时被首次初始化。
由于static变量的以上特性,可实现一些特定功能。
1. 统计次数功能
声明函数的一个局部变量,并设为static类型,作为一个计数器,这样函数每次被调用的时候就可以进行计数。这是统计函数被调用次数的最好的办法,因为这个变量是和函数息息相关的,而函数可能在多个不同的地方被调用,所以从调用者的角度来统计比较困难。
  • 打赏
  • 举报
回复
加载更多回复
相关推荐
发帖
C语言
加入

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
申请成为版主
帖子事件
创建了帖子
2010-12-21 10:35
社区公告
暂无公告