b.#define QINTERFACE(iname)\
struct _##iname{\
struct VTBL(iname) *pvt;\
};\
typedef struct VTBL(iname) VTBL(iname);\
struct VTBL(iname)
c.#define INHERIT_IBase(iname)\
uint32 (*AddRef)(iname *);\
uint32 (*Release)(iname *)
d.#define INHERIT_IModule(iname)\
INHERIT_IBase(iname);\
int (*CreateInstance)(iname *po,IShell *pIShell,AEECLSID ClsId,void **ppObj);\
void (*FreeResouces)(iname *po,IHeap *ph,IFileMgr *pfm)
e. #define GET_PVTBL(p,iname) ((iname*)(void*)p)->pvt
语句
typedef struct _IModule IModule;
QINTERFACE(IModule)
{
INHERIT_IModule(IModule);
};
#define IMODULE_AddRef(p) GET_PVTBL(p,IModule)->AddRef(p)
用宏替换之后:
typedef struct _IModule IModule;
struct _IModule{
struct IModuleVtbl *pvt;
};
typedef struct IModuleVtbl IModuleVtbl;
struct IModuleVtbl
{
uint32 (*AddRef)(IModule *);
uint32 (*Release)(IModule *);
int (*CreateInstance)(IModule *po,IShell *pIShell,AEECLSID ClsId,void **ppObj);
void (*FreeResouces)(IModule *po,IHeap *ph,IFileMgr *pfm);
};
#define IMODULE_AddRef(p) ((IModule *)(void*)p)->pvt ->AddRef(p)