首先#ifdef指如果已经定义了一个标识符,则按以下处理。
第一句,如果已经定义了STRICT
第二句,把void*类型标识为HANDLE
第三句,定义宏函数DECLARE_HANDLE()是为了方便随时声明一个新的句柄类型,其中name是宏函数的参数,也就是新的句柄类的类名,然后把这个新类型的指针类型和name互为同义词
第四句,#else对应#ifdef,如果不是这种情况(没有定义STRICT),那么:
第五句,定义 PVOID HANDLE
第六句,定义宏函数DECLARE_HANDLE(),此时函数作用是将形参name和HANDLE在标识上等价
第七句,结束#ifdef和#else的作用域
第八句,把HANDLE* 和 PHWNDLE定义为同义词
这里需要注意的是这几行代码的空格的位置很误导人,比如第二句的void*,第三句的name##__*都不应该那么看的。##是宏定义连接运算符。
寻平阳老兄讲得很好,概括得说,使用的时候定义一个新句柄结构体类型
DECLARE_HANDLE(MYHANDLE);
MYHANDLE pointer; //注意这里定义的是一个指针变量,刚定义是没有指向的
//对pointer赋值后
pointer->unused;
#define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
//举个例子:
//调用:
DECLARE_HANDLE(HINSTANCE);
//用宏定义代替它就是:
struct HINSTANCE__ { int unused; }; typedef struct HINSTANCE__ *HINSTANCE;
//(注意:##为连接符号,表示把左右两边的内容连接起来)
//即:
struct HINSTANCE__ {
int unused;
};
typedef struct HINSTANCE__ *HINSTANCE;
//这样也就是得到了一个自定义结构指针类型 HINSTANCE,
//它可以用来定义指向HINSTANCE__ { int unused; };结构体的指针变量
//简单使用:
HINSTANCE aaa;
aaa->unused;