全局变量与局部变量

作者在 2008-11-17 10:10:51 发布以下内容
    有些朋友在学习罗云彬的<Windows环境下32位汇编语言程序设计>一书第五章的时候,对Menu 例子程序中的关于全局变量与局部变量的用法有些疑惑.
    如,在Menu 例子程序中,hSubMenu 这个子菜单句柄变量,如果放在了局部变量中(即窗口过程中),程序正常,却没有弹出菜单;而改为放在全局变量中,才弹出菜单.
    为什么?
    我在学习该书第五章的"使用图标和光标"内容的时候,也遇到了类似的问题:如果,把hIconBig,hIconSmall,hCur1,hCur2 这几个句柄变量都设为局部变量,则程序虽然编译通过且运行了,但所加载的图标和光标都没有起作用!将它们改成全局变量就可以了.
    于是,我用BAIDU搜了一下,在看雪论坛上看到了这样的话: 全局变量作用于整个程序,一直是存在的,它放在全局变量的内存区;而局部变量则是存在于函数的堆栈区,当函数调用结束后便消失。
    原来如此.
    子程序(上述的窗口过程,或函数)在被调用的时候,每一次被调用都要开辟新的局部变量的堆栈空间,调用完了之后,就要释放这些空间了.上述例子程序中,hIconBig,hIconSmall,hCur1,hCur2被安排在了子程序中,则子程序收到WM_CREATE后,虽然加载了光标和图标,且取得了它们的句柄.但子程序在收到WM_COMMAND 后,又再次调用,而上次保存在堆栈中的句柄就不见了.
    我解决的办法是:把hIconBig,hIconSmall,hCur1,hCur2安排为局部变量也可以.但获取句柄和加载它们的时候,都放在同一个WM_COMMAND消息中就可以了.
   
    听到有位牛人好像说过:他写程序,再大的程序,全局变量一般只有一个!可见十分清楚全局变量和局部变量的区别,及运用方法.
    PS:啥时候你也牛一把?!
文章评论,共3条
djxh77710
2008-11-20 17:23
1
我今天刚看到第五章,昨天一朋友给了我一个WINASM 好像资源文件就像VB一样,直接垃控件就可以了,不用写代码了,....局部变量...全局变量...我貌似还没有吃透..
zklhp
2008-11-21 13:08
2
偶感觉全局变量少了好 不过印度的程序员好用全局变量 这个见仁见智吧 全局变量出错少 那个堆栈经常是很多问题的根源啊
ONEPROBLEM(作者)
2008-11-22 09:07
3
尽量把变量定义为局部变量也有许多好处~~如,使子程序变成个黑匣子,便于移到各个主程序中使用~~
游客请输入验证码