#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, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name; }
这个宏定义的第三行到第五行是什么意思?另外第二行的#class_name就一个#号是什么意思,谢谢了!

解决方案 »

  1.   

    #class_name相当于"class_name",就是把一个标识符转成同内容字符串
      

  2.   

    举例说明:
    _IMPLEMENT_RUNTIMECLASS(CButton, CWnd, wSchema, pfnNew)
    被展开成
    static char _lpszCButton[] = "CButton";
    CRuntimeClass class_name::classCButton = {
        _lpszCButton,
        sizeof(CButton),
        wSchema,
        pfnNew,
        RUNTIME_CLASS(CWnd),
        NULL
    };
    static AFX_CLASSINIT _init_CButton(CButton::classCButton);
    CRuntimeClass* CButton::GetRuntimeClass() const
    {
        return &CButton::classCButton;
    }##则是把前后两个symbol直接相连
      

  3.   

    哦,分特,漏了一处
    CRuntimeClass CButton::classCButton = {
        _lpszCButton,
        sizeof(CButton),
        wSchema,
        pfnNew,
        RUNTIME_CLASS(CWnd),
        NULL
    };
      

  4.   

    一个成员函数后面跟个“=”再跟一对花括号,里面若干参数,是什么意思啊?
    CRuntimeClass class_name::class##class_name = { \
    _lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
    RUNTIME_CLASS(base_class_name), NULL }; 
    这个是什么意思啊?
      

  5.   

    CRuntimeClass class_name::class##class_name = { \
    _lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
    RUNTIME_CLASS(base_class_name), NULL }; \
    请问“::”后的是那个成员是CRuntimeClass结构体里的哪个成员?
    附:
    struct CRuntimeClass
    {
    // Attributes
    LPCSTR m_lpszClassName;
    int m_nObjectSize;
    UINT m_wSchema; // schema number of the loaded class
    CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
    CRuntimeClass* m_pBaseClass;
    // CRuntimeClass objects linked together in simple list
    static CRuntimeClass* pFirstClass; // start of class list
    CRuntimeClass* m_pNextClass; // linked list of registered classes
    };