小公司怎样自己建网站,wordpress 时间轴 主题,常熟专业做网站,一元购网站建设流程图最近有些朋友在看《深入浅出MFC》的时候#xff0c;被第三章的几个宏给卡住了#xff0c;记得我第一次看此书时#xff0c;也被这几个宏给卡住。当然真正卡人的其实是第一个#xff0c;也就是DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC。我做了一个详解#xff0c;供同样被卡住的…最近有些朋友在看《深入浅出MFC》的时候被第三章的几个宏给卡住了记得我第一次看此书时也被这几个宏给卡住。当然真正卡人的其实是第一个也就是DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC。我做了一个详解供同样被卡住的朋友做个参考 说明这两个宏的主要目的是在所指定的class比如CView的声明和实现里加上一些静态成员函数和静态成员变量。所以不要管“/”这个换行标志就把里面的每一句话当作是在类里的声明或者是实现。另外“##”和#符号我就不不赘述了。 另外建议结合《深入浅出MFC》这本书JJHou写了一些展开宏的实例结合实例看这个解释可能效果会比较好一点 DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC #define DECLARE_DYNAMIC(class_name)/ public:/ static CRuntimeClass class##class_name;/ //声明一个类型为CRuntimeClass的静态public成员变量变量名是由字符串class //与所指定的类的类名组成。举例而言如果你写DECLARE_DYNAMIC(CMyView)则等于声明了一个 // static CRuntimeClass classCMyView静态变量 virtual CRuntimeClass* GetRuntimeClass() const;/ //声明一个虚函数函数名为GetRuntimeClass返回值为CRuntimeClass类型的指针 //无参数并且是个const函数 #define IMPLEMENT_DYNAMIC(class_name,bass_class_name)/ _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL) #define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)/ static char _lpsz##class_name[] #class_name;/ //定义一个C类型字符串静态变量变量名由_lpsz和指定类的类名组成变量值为该指定类型的名字 //比如是CMyView那么定义的就是static char _lpszCMyViewCMyView; CRuntimeClass class_name::class##class_name {/ _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/ RUNTIME_CLASS(base_class_name),NULL};/ //给之前在DECLARE_DYNAMIC里定义的CRuntimeClass类型的静态成员变量赋值 //当然除最后一个m_pNextClass没有赋值赋值为NULL它由下面的结构处理 static AFX_CLASSINIT _init_##class_name(class_name::class##class_name);/ //初始化一个名为_init_##class_name的AFX_CLASSINIT静态结构主要作用是给指定的class_name的 //class##class_name静态变量的最后一个成员m_pNextClass赋值具体见下面解释AFX_CLASSINIT中 CRuntimeClass* class_name::GetRuntimeClass() const/ { return class_name::class##class_name;}/ //之前在DECLARE_DYNAMIC里定义的GetRuntimeClass的实现很简单就一个return语句。 #define RUNTIME_CLASS(class_name)/ (class_name::class##class_name) //这部分之所以单独define出一个宏主要是为了方便从某个指定的class直接得到它的CRuntimeclass静态成员 //以下是解释AFX_CLASSINIT结构注意这不是一个宏 //为了看得更加清楚我按照struct定义的惯常格式来写这个struct的定义 struct AFX_CLASSINIT { AFX_CLASSINIT(CRuntimeClass *pNewClass); }; AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass) { pNewClass-m_pNextClass CRuntimeClass::pFirstClass; //让m_pNextClass指向pFirstClass所指的CRuntimeClass变量 CRuntimeClass::pFirstClass pNewClass; //让pFirstClass指向pNewClass所指的变量也就是本class的CRuntimeClass静态变量 }