关于<深入浅出mfc>的static。

sdcer777 2003-09-11 10:17:51
本书我喜欢第三章,但我今天发现了一个问题:
#define DECLARE_DYNAMIC(class_name)\
public:\
static CRuntimeClass class##class_name;\
virtual CRuntimeClass* GetRuntimeClass() const;
上面是类别型录网的定义,请大家注意其中的static,应该是表示class##class_name是个静态的。请再看下面的代码。
#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)\
static char _lpsz##class_name[]=#class_name;
CRuntimeClass class_name::Class##class_name={\
_lpsz##class_name,....}
我想问的是为什么_lpsz##class_name[]还要设成static型?我知道static意味着永久存在的含义。但既然在DECLARE_DYNAMIC()中已经将CRuntimeClass()设成静态的了,那CRuntimeClass()内的成员还要设成static的吗?有这个必要吗?不可理解。。。
...全文
67 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mfcdeclare 2003-09-17
  • 打赏
  • 举报
回复
这里static不能用通常的用法来理解,其实不加一样,只是程序的可读性更好,因为加上了static,人们更容易理解,这个值是不变的。
sdcer777 2003-09-12
  • 打赏
  • 举报
回复
飞不起来的笨鸟所说的"用static修饰的全局变量的作用域是全局的,但可视性是局部的,只有定义这个全局变量的文件可以使用这个变量"是什么意思?
我还是想知道如果这里不加static行不行?只要能保证_lpsz##class_name[]一直存在(不会消失掉,以至于找不到),不就满足了要求?而如果把它只定义成一个全局的(但不加static),不也可以?因为全局变量也是不会消失的啊。。
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
我也看了一下C++的书,书上说将数据成员声明为静态的,是为了解决数据的共享问题。
书上说:“将数据成员声明为静态的,将使所有的同类对象都拥有同一份静态成员,该静态成员遵守数据封装的约定。静态数据成员是类的成员,他不是任何对象独占的成员,所有该类的对象中的静态成员都使用同一内存地址。”
xghost 2003-09-12
  • 打赏
  • 举报
回复
不加static的话,在类运行识别时就无法得知该变量的值,因为当时还没有对象,加了static后,该变量就属于类的,而不属于对象。
总之,MFC用宏的做法是一种不标准的处理方法。
sdcer777 2003-09-12
  • 打赏
  • 举报
回复
这岂不是矛盾?!
Pengcheng2006 2003-09-12
  • 打赏
  • 举报
回复
我VC不大懂,我也说两句。全局量不允许是static的,只有局部量才能定义为static的。
ztfans 2003-09-12
  • 打赏
  • 举报
回复
我又再仔细看了一下有关C++的书,发现正如飞不起来的笨鸟兄所说,鹏程和xghost的说法都是错误的。
sdcer777 2003-09-12
  • 打赏
  • 举报
回复
我也不明白,能不能再给讲讲,反正我还是觉得_lpsz##class_name[]前加不加static都可以... 请指点
cx0928 2003-09-12
  • 打赏
  • 举报
回复
不明白
ruihuahan 2003-09-12
  • 打赏
  • 举报
回复
用static来修饰一个全局变量到底有何意义?
变量除了作用域scope,还有可视性visibility。而用static修饰的全局变量的作用域是全局的,但可视性是局部的,只有定义这个全局变量的文件可以使用这个变量,类似于java和C#中的internal变量。
sdcer777 2003-09-11
  • 打赏
  • 举报
回复
我有点明白了,但正如小涛所讲,用static来修饰一个全局变量到底有何意义?只用一个全局变量不也行吗
gezihou 2003-09-11
  • 打赏
  • 举报
回复
只不过是让一个字符串的值始终保持不变,存有该类的名
ztfans 2003-09-11
  • 打赏
  • 举报
回复
确实如楼上所说,但它为什么要定义成static的呀?用static来修饰一个全局变量到底有何意义?
gezihou 2003-09-11
  • 打赏
  • 举报
回复
char _lpsz##class_name[]并不是CRuntimeClass的成员,也不是静态对象static CRuntimeClass class##class_name的成员,他只是一个全局的静态变量,只不过其值赋给拉CRuntimeClass class_name::Class##class_name类

16,471

社区成员

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

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

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