| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 693 人关注过本帖
标题:求助关于静态变量的问题
只看楼主 加入收藏
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
结帖率:0
收藏
已结贴  问题点数:20 回复次数:10 
求助关于静态变量的问题
在网上看到这样解释静态变量的用法
如果某外部变量和函数仅供它们各自所在的源文件中的函数使用,而不能被其他函数访问,那么就必须使用static关键字定义外部变量和函数。static说明适用于外部变量与函数,用于把这些对象的作用域限定为被编译源文件的剩余部分。通过外部static对象,可以把一些外部变量和函数隐藏在某个源文件中,使得这些外部变量和函数仅仅可以被该源文件使用和共享,但不能被该源文件之外的函数所引用。


我疑惑的是
比如int i,如果不用static这个声明,那么其他文件里的函数不也不能使用i这个变量吗?因为要使用的话要先extern int i才行啊,那么static的作用在哪呢?


ps 这个论坛注册真麻烦啊。。。那些图我眼都快看瞎了,呵呵
搜索更多相关主题的帖子: 函数 其他 网上 
2011-09-27 11:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:10 
你复习一下书上关于作用域的陈述。int i这样语句,放置在不同位置有不同的行为方式,你看清楚了。

授人以渔,不授人以鱼。
2011-09-27 12:43
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
收藏
得分:0 
以下是引用TonyDeng在2011-9-27 12:43:00的发言:

你复习一下书上关于作用域的陈述。int i这样语句,放置在不同位置有不同的行为方式,你看清楚了。

如果在a.c文件里有一个int i=2
那么在b.c文件里如果不声明extern int i的话,也是无法使用a.c里面的那个i的
我这样理解的 是不是呢?
2011-09-27 15:05
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:10 
回复 3楼 giggsxbr
恩,对

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-09-27 15:30
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
收藏
得分:0 
以下是引用A13433758072在2011-9-27 15:30:23的发言:

恩,对


那么加static和不加static有什么区别呢?我这样没有static,其他文件里的函数也不能使用啊(除非加一个extern申明)
2011-09-27 15:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在函数体外,即在全局中,就是全局变量,与static是相同的效能。但static主要用局部作用域中,在其所处的花括号内,它是永远存在的,但在这个花括号之外,却不存在,这个特殊功能,正是全局变量不具备的。

授人以渔,不授人以鱼。
2011-09-27 16:04
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
收藏
得分:0 
以下是引用TonyDeng在2011-9-27 16:04:49的发言:

在函数体外,即在全局中,就是全局变量,与static是相同的效能。但static主要用局部作用域中,在其所处的花括号内,它是永远存在的,但在这个花括号之外,却不存在,这个特殊功能,正是全局变量不具备的。



如果某外部变量和函数仅供它们各自所在的源文件中的函数使用,而不能被其他函数访问,那么就必须使用static关键字定义外部变量和函数


我是看到了这句话,它说不能被其他函数访问的话就必须使用static,但是用我那个例子,即便不用static,其他函数访问的话也要破费一番周折啊
2011-09-27 16:16
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
有声明和定义两种。在文件级,像int i这样的语句,是定义,一个程序无论分多少模块文件,都只能有一个定义,如果这个文件中所定义的变量不想给别的文件模块使用,这样写就可以了,它只在这个模块内存在;但如果要让其它的模块使用,在那个(别的)模块中就要写extern int i,这是声明,表示i已经被别的模块定义过,现在只管使用,但这句话并没有任何实际动作(不会分配空间、没有初始化),没有使用extern声明的模块,仍然无法访问这个变量。因此,在功能上看,这种全局变量是文件层次的静态变量。

授人以渔,不授人以鱼。
2011-09-27 16:31
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
收藏
得分:0 
回复 8楼 TonyDeng
这样,我说一下我的想法吧

如果在1.c里面定义了int i,那么要想在2.c里面使用i这个变量,就需要声明一下extern int i。如果没有这个声明,那么2.c这个文件是不能使用i那个变量的,对不?那为什么要加上static,来让这个外部变量“不能被其他函数访问”呢?它本来就不能被其他文件的其他函数访问啊。(因为要访问要事先声明)

我是在看W.Kernighan和M.Ritchie编写的《The C Programming Language》中文版里看到这样的问题产生疑惑的。中文版的70页,在说那个波兰计算器问题的时候引入了静态变量,原文是“通过static限定外部对象,可以达到隐藏外部变量的目的....”可是我觉得本来就是隐藏的啊(因为要事先声明,才能使用)

我的理解应该是错的,但是错在哪呢?
2011-09-27 17:42
giggsxbr
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2011-9-27
收藏
得分:0 
回复 8楼 TonyDeng
这位小飞侠 我感觉我的语言表述能力有点差 希望没让你抓狂
2011-09-27 17:49
快速回复:求助关于静态变量的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031627 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved