我对C语言中的static void func()不是很理解

taft 2005-02-17 06:43:46
在阅读一个开源代码时,我就是无法理解这个函数前加个static的意思,返回值是静态的?什么意思呢?谢谢大家的解答
...全文
1390 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sky911911 2005-02-18
  • 打赏
  • 举报
回复
最好能举个例子(关于static和extern的) 那样就鲜明多了!!!我早了一点。大家分享
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
内部函数和外部函数

  函数一旦定义后就可被其它函数调用。 但当一个源程序由多个源文件组成时, 在一个源文件中定义的函数能否被其它源文件中的函数调用呢?为此,C语言又把函数分为两类:

一、内部函数

  如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其它文件中的函数调用, 这种函数称为内部函
数。定义内部函数的一般形式是: static 类型说明符 函数名(形参表) 例如:
static int f(int a,int b) 内部函数也称为静态函数。但此处静态static 的含义已不是指存储方式,而是指对函数的调用范围只局限于本文件。 因此在不同的源文件中定义同名的静态函数不会引起混淆。

二、外部函数
  外部函数在整个源程序中都有效,其定义的一般形式为: extern 类型说明符 函数名(形参表) 例如:
extern int f(int a,int b)如在函数定义中没有说明extern或static则隐含为extern。在一个源文件的函数中调用其它源文件中定义的外部函数时,应 用extern说明被调函数为外部函数。例如:
F1.C (源文件一)
main()
{
extern int f1(int i); /*外部函数说明,表示f1函
数在其它源文件中*/
……
}
F2.C (源文件二)
extern int f1(int i); /*外部函数定义*/
{
……
}
Rudy_zhuang 2005-02-18
  • 打赏
  • 举报
回复
对于全局的元素(这里是指不放在栈中的临时数据),如全局变量,函数,定义时出现static的作用是为了降低模块间的耦合度。即它不能被extern关键字来声明,否则会出现链接错误。
对于函数来说,它始终是位于文本段的,不象变量还有位置的差异,所以,对于用static限制定义的函数可以简单理解为是局部函数,外部不可直接访问(除非通过函数指针来找到这个函数的入口地址),不需要再考虑其他的了。
其实在这一点上,更多的是体现了一个程序员的编程风格。

若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量(用static来修饰),以降低模块间的耦合度
若全局变量仅在单个C文件中访问,则可以用static来修饰,将这个变量修改为静态全局变量,以降低模块间的耦合度;。
说明:当static用来修饰局部变量时,它改变了局部变量的存放位置,将其由原来的堆栈改为全局静态储存区,但是没有改变变量的作用域,还是局限在局部的{}里。
当static用来修饰全局变量时,它限制了全局变量的作用域,使其不能被别的程序extern,限制在了当前文件里,但是没有改变其存放位置,还是在全局静态储存区。
xuelong_zl 2005-02-18
  • 打赏
  • 举报
回复
回复人: nodummy(某人马甲的马甲的马甲) ( )

//===========================

谢谢你的指正,我也是初学,希望以后你多指教

我现在在概念上也明白一些了,不过上面所说的都是语法上的东东,我感觉读代码时重要的是分析思路和原因.

从上面的概念上看,我感觉是写这个程序的人,不希望别人能修改此函数,如果从接口的方面说,感觉就是写程序

的人不只希望它用于文件内部,而不希望这个函数成为接口

不知道高手们是如何看这个问题呢?
Great_Bug 2005-02-17
  • 打赏
  • 举报
回复
这个时候应当去找标准来看那。
bingbing1981 2005-02-17
  • 打赏
  • 举报
回复
加了这个static在其他文件中就见不到这个函数名了
kobefly 2005-02-17
  • 打赏
  • 举报
回复
文件作用域
bailingke 2005-02-17
  • 打赏
  • 举报
回复
static和extern这里是相对的。这个关键字有很多含义的。
Student02370236 2005-02-17
  • 打赏
  • 举报
回复
带了static关键字的变量或者函数在内存中不会有多个副本.因此是静态的.
Student02370236 2005-02-17
  • 打赏
  • 举报
回复
在C语言中,函数返回类型前加上static表示这是一个静态函数,不能被其它文件里的程序所调用,因此在不同文件中可以存在同名但不同功能的函数。
如果static加在变量前面又要分两种情况:第一,静态局部变量,它位于函数中,就是qinxiaolin说的那种情况,在函数退出后仍然存在,原因就是这类变量是保存在内存的静态存储区,其值不会因函数的退出而消失,但是在其它函数是不能引用这些变量的;第二,静态外部变量,这类变量的使用范围是在本文件内,其它文件中出现了同名的变量也不会发生冲突.
heroboy2000 2005-02-17
  • 打赏
  • 举报
回复
static void func() == void func()
这里static修饰的是函数,不是返回的参数。
如果函数不是static的,就是extern的。
extern函数可以被其它文件中的函数调用。
extern void func();
qinxiaolin 2005-02-17
  • 打赏
  • 举报
回复
static void func()
对于static的用法和其用途有很多:
 对于上面这种情况,说明该函数是一个静态函数,是限定func()的函数作用域只在定义该函数的文件域中有效,若其它文件调用该函数则是非法的;
 如果在一个函数中定义一个静态变量如:
int func()

static int a;
a =a+3;
return a;
}那么你每次调用func()函数的时候,a会将上一次调用func()函数的后a结果保留下来,但变量a只在该函数中可知,但编译器为它产生的却是和全局变量相同的永久性存储区.
static 还有一些其它的作用我也不太明白~
Jupin 2005-02-17
  • 打赏
  • 举报
回复
表明函数是静态的, 这个函数只能由与它在同一文件内的其它函数调用.
taft 2005-02-17
  • 打赏
  • 举报
回复
void 表明这个函数没返回值啊
nodummy 2005-02-17
  • 打赏
  • 举报
回复
这个时候的static是一个域作用符,限定该符号仅在文件域内有效,出了这个文件就算有func也不是这个文件的func了

楼上的理解是在说static的变量,那个是在函数里面修改变量生命周期的static,语义不一样了(其实static在C99里面还有其他的意义,不过那个语义和这两个无关……)
xuelong_zl 2005-02-17
  • 打赏
  • 举报
回复
那要看程序的需要了,如果它希望以后还可以调就这个返回值,或是说它不想这个返回值消失,就要加了,这样这个返回值就可以存放在静态区了,不然就在栈中了,随着函数的调用结束,这个返回值也没消失了

个人看法,你再听听高手的说法吧
iThinker 2005-02-17
  • 打赏
  • 举报
回复
这里static是函数声明作用域修饰符,表示该声明只在该源码文件内有效。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧