静态全局变量问题

[复制链接]
1785|18
 楼主| txcy 发表于 2013-10-29 16:06 | 显示全部楼层 |阅读模式
我先在头文件CAttemperEngineSink.h中声明的静态变量:
static INT isGetBetPool=0;

又在CInitSystemDlg.cpp中改变变量isGetBetPool++;(CInitSystemDlg与CAttemperEngineSink在同一个项目中)

最后在CAttemperEngineSink.cpp中调用:
int i=isGetBetPool;

问题:我在调试的时候却发现最后调用的时候isGetBetPool为1,但i却是0,这是为啥?
无冕之王 发表于 2013-10-29 16:20 | 显示全部楼层
“变量赋值”和“变量初始化”不是一回事!
“变量赋值”发生在运行期,其写法遵循赋值语法规定。
“变量初始化”发生在编译期或运行期,其写法遵循初始化列表语法规定。
pkat 发表于 2013-10-29 16:38 | 显示全部楼层
static INT isGetBetPool=0;
isGetBetPool 是内部链接呀. 在每个cpp文件里,isGetBetPool是独立的.
建议楼主谷歌下内部链接与外部链接,彻底搞明白这个问题
火箭球迷 发表于 2013-10-29 16:41 | 显示全部楼层
这样情况还是用 extern

包含一个H头文件就多一个变量cop
戈卫东 发表于 2013-10-29 19:05 | 显示全部楼层
全局变量本来就是静态,再加一个static其实它会变成只有当前文件可见.于是包含了头文件的CPP都会有自己的定义....
comeon201208 发表于 2013-11-10 20:39 | 显示全部楼层
最好不要直接在.h文件中申明变量的,在.c开头申明,可在.h文件中引申就可以啦
comeon201208 发表于 2013-11-10 20:40 | 显示全部楼层
这个是跟单片机分配内存有直接的关系的啊
firstblood 发表于 2013-11-15 00:11 | 显示全部楼层
无冕之王 发表于 2013-10-29 16:20
“变量赋值”和“变量初始化”不是一回事!
“变量赋值”发生在运行期,其写法遵循赋值语法规定。
“变量初 ...

哦,我也了解下的了,这方面的我在调试程序的时候有时也很郁闷的,主要也是出现这样的问题的
smilingangel 发表于 2013-11-18 20:08 | 显示全部楼层
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量。

静态局部变量具有局部作用域。它只被初始化一次,自从第一次初始化直到程序与你新内阁结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
smilingangel 发表于 2013-11-18 20:09 | 显示全部楼层
这个是二者的区别的,这样应该很好理解了啊
smilingangel 发表于 2013-11-18 20:12 | 显示全部楼层
静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,他们也是不同的变量。
smilingangel 发表于 2013-11-18 20:12 | 显示全部楼层
变量用static告知编译器,自己仅仅在变量的作用域范围内可见。这一点是他与全局变量的区别。
smilingangel 发表于 2013-11-18 20:12 | 显示全部楼层
把局部变量改变为静态变量后是改变了他的存储方式,即改变了他的生存期。把全局变量改变为静态变量后是改变了他的作用域,限制了他的使用范围,因此static这个说明符在不同的地方起的作用是不同的。
smilingangel 发表于 2013-11-18 20:13 | 显示全部楼层
函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。
ayb_ice 发表于 2013-11-21 17:17 | 显示全部楼层
没有外部的静态变量之说
ayb_ice 发表于 2013-11-21 17:21 | 显示全部楼层
smilingangel 发表于 2013-11-18 20:13
函数中必须要使用static变量的情况:当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返 ...

片面了,

如:
函数中产生了数据,动态分配内存,内存保存数据,通过指针返回给调用者处理,调用者处理后通过指针释放内存,这很常用的
vivilzb1985 发表于 2013-11-25 20:00 | 显示全部楼层
smilingangel 发表于 2013-11-18 20:08
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全 ...

介绍的非常不错的,我也参考下的了
vivilzb1985 发表于 2013-11-25 20:00 | 显示全部楼层
smilingangel 发表于 2013-11-18 20:08
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全 ...

介绍的非常不错的,我也参考下的了
shenmu2012 发表于 2013-11-26 23:25 | 显示全部楼层
smilingangel 发表于 2013-11-18 20:08
全局变量具有全局作用域。全局变量只需在一个源文件中定义,就可以作用于所有的源文件。当然,其他不包括全 ...

楼上介绍的非常不错的,我借鉴下的了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

274

主题

2106

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部