什么情况下应该加 static 标识符?

cuckooo 2003-08-22 09:24:12
什么情况下,在申明一个变量时应该加上 static 标识符?
以前只知道类的实例无关变量应该加上 static 标识,平时在看别的人程序时,常常见到这个标识,心底隐隐地疑惑,也没太在意.而且很多情况下,有没有这个标识对程序编译运行结果没什么影响. 看MSDN的文档也似懂非懂,说"程序结束前变量的值为静态".到底什么情况下,应该加 static 标识,请大家教我.
...全文
54 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
呵呵, 仔细研究了下,这些 static 表面看起来是可以删掉的, 其实不能. 真是太爽了,以前要用全局变量或者作用范围更大的变量才能处理的问题,现在用 static 就可以搞定了. 谢谢 Joran(老朱)!!
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
有点明白了,真是太爽了. 在函数结束后,这些变量的值好像仍然会维持不变. 真是奇怪而且方便实用的方法.
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
不明白.能不能讲详细点. 这样做到底有什么道理? 因为去掉这些 static 好像没什么影响.
Joran 2003-08-22
  • 打赏
  • 举报
回复
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL bValidFile ;
static BYTE buffer[MAXREAD] ;
static HWND hwndList, hwndText ;
static RECT rect ;
static TCHAR szFile[MAX_PATH + 1] ;
HANDLE hFile ;
HDC hdc ;
int i, cxChar, cyChar ;
PAINTSTRUCT ps ;
TCHAR szBuffer[MAX_PATH + 1] ;
......
}
比如这些,是何道理?

______________________________________________________________
这些static不是在堆中分配空间,而是在静态数据区。由所有的同一个函数共享。
位置上有点象全局变量。
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
详见Programming Windows--by Charles Petzold, chapter 9, Head.c
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
static BOOL bValidFile ;
static BYTE buffer[MAXREAD] ;
static HWND hwndList, hwndText ;
static RECT rect ;
static TCHAR szFile[MAX_PATH + 1] ;
HANDLE hFile ;
HDC hdc ;
int i, cxChar, cyChar ;
PAINTSTRUCT ps ;
TCHAR szBuffer[MAX_PATH + 1] ;
......
}
比如这些,是何道理?
cuckooo 2003-08-22
  • 打赏
  • 举报
回复
类中static标识的应用已经基本上明了了, 只是在别的地方,比如说一个函数中,为什么有时候变量的声明要加上 static 标识, 就不清楚了. (在Windows程序设计--Charles Petzold这本书随处可见这种情况,然而我试过,除类中的用法外,用不用 static 标识,结果都是一样的. 但我想既然大师这样用,肯定有他的道理)
SongBarry 2003-08-22
  • 打赏
  • 举报
回复
静态变量在整个类中只有一份,在堆区获得内存,为类的所有对象共享。
而非静态变量则类的每个对象都获得一个内存,各是各的,不共享,有多份。
honglunxu 2003-08-22
  • 打赏
  • 举报
回复
静态变量好象在堆中分配内存
gjgj3368 2003-08-22
  • 打赏
  • 举报
回复
用static声明的变,只会被初始化一次,它的作用域比局部变量要广。
如果在一个类中声明了这种变量,那么在生成这个类的实例之前,该变就可以使用。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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