初学MFC,对于其中宏的问题有些不解,以前学C和C++,宏都是用一个字符串来代替一个字符串或者一个表达式,
可是MFC中,有些宏是和以前学的一样,可是有些很奇怪,比如在
Class
{
DECLARE_DYNAMIC(CMyClass)
……
}
这个宏到底是什么意思呢,  是应该看做一个函数吗?
求达人能大概讲讲,MFC宏是个怎么回事?

解决方案 »

  1.   

    MFC深入浅出,对这些做了很详细的说明
    DECLARE_DYNAMIC
    DECLARE_DYNCREATE
    DECLARE_MESSAGE_MAP()
    ...
      

  2.   

    go to def....曰:几个奇怪的宏,一张巨大的网~
    愿听更详~
      

  3.   

    DECLARE_DYNAMIC(CMyClass)
    ============
    这个宏展开来一大堆,《深入浅出MFC》中有详细的说明,加这个的作用是让CMyClass支持动态创建。
      

  4.   

    DECLARE_DYNAMIC 宏的含义  DECLARE_DYNAMIC(class_name)   说明:    但从CObject派生一个类时,此宏增加关于一个对象类的访问运行时间功能。把DECLARE_DYNAMIC宏加入类的头文件中,然后在全部需要访 问词类对象的.CPP文件中都包含此模块。如果像所描述那样使用DELCARE_DYNAMIC和IMPLEMENT_DYNAMIC宏,那么用户便可使 用RUNTIME_CLASS宏和CObject::IsKindOf函数以在运行时间决定对象类。如果DECLARE_DYNAMIC包含在类定义中, 那么IMPLEMETN_DYNAMIC必须包含在类工具中。 
           DECLARE_DYNCREATE 宏的含义  DECLARE_DYNCREATE(class_name)   说明:    使用DECLARE_DYNCRETE宏以便允许CObject派生类的对象在运行时刻自动建立。主机使用此功能自动建立新对象,例如,但它在串行化过 程中从磁盘读一个对象时,文件及视图和框架窗应该支持动态建立,因为框架需要自动建立它。把DECLARE_DYNCREATE宏加入类的.H文件中,然 后在全部需要访问此类对象的.CPP文件中包含这一模式。如果DECLARE_DYNCREATE包含在类定义中,那么 IMPLEMENT_DYNCREATE必须包含在类工具中。
      

  5.   

    正解。
    动态创建。
    看MFC深入详解。
    里面有具体模拟。
      

  6.   

    这个宏展开之后是很长的一段代码,建议楼主看一下深入浅出MFC
    宏并不是简单的一小段字符,而是强大的编程手段,MFC的强大之一就是很巧妙的使用了宏编程
      

  7.   

    建议去看看 深入浅出mfc  不过基本上会搞死你 
      

  8.   

    If you use the DECLARE_DYNAMIC and IMPLEMENT_DYNAMIC macros as described, you can then use the RUNTIME_CLASS macro and the CObject::IsKindOf function to determine the class of your objects at run time.
    If DECLARE_DYNAMIC is included in the class declaration, then IMPLEMENT_DYNAMIC must be included in the class implementation.
      

  9.   

    其实宏就是字符串的简单的替换,比如:
    #define a(dsf,ddd) (ccc=dsf+ddd)int c=10;int d=10;int ccc;
    a(c,d);
    在预编译的时候a(c,d)这段字符串会被替换为:(ccc=c+d);
    然后再进行编译,至于在编译的时候,这段代码能不能通过,就看类型匹配不匹配了!!!!
      

  10.   

    初学MFC,对于其中宏的问题有些不解,以前学C和C++,宏都是用一个字符串来代替一个字符串或者一个表达式
    --------------------------------------------------------------------------------
    宏现在也是这样子滴....
    Class
    {
    DECLARE_DYNAMIC(CMyClass)
    ……
    }
    宏展开后:class 
    {
     public:
        static CRunTimeClass classCMyClass;
        virtual CRunTimeClass* GetRunTimeClass() const; 
        
    };也就是说 DECLARE_DYNAMIC(CMyClass)这样定义滴:#define DECLARE_DYNAMIC(CMyClass) \
    static CRunTimeClass class##CMyClass;\
    virtual CRuntimeClass* GetRunTimeClass() const;相当于给class 扩展了内容所以,宏还是当年那个宏......
    至于具体用法,参见《深入浅出MFC》
      

  11.   

    宏是可以带参数的,比如:#define MAXNUM(a,b) (a > b ? a , b)
      

  12.   

    纠正一下:#define MAXNUM(a,b) (a > b ? a : b)