查找HBITMAP类型的定义的时候发现,它的定义尽然来自于一个奇怪的宏:DECLARE_HANDLE(HBITMAP)。再查找DECLARE_HANDLE,发现它的定义是:
    #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name。以HBITMAP做为参数展开这个宏,发现HBITMAP的定义是这样一个形式:
                               struct HBITMAP__
                           {
                               int unused;
                           };                           typedef struct HBITMAP__ *HBITMAP 其中的成员int unused,从名字上判断是不起作用的,不明白为什么要把HBITMAP定义成一个这样的结构类型,定义成一个整型不是更直观吗?请高人来给解释解释其中的奥妙。

解决方案 »

  1.   

    typedef void *PVOID;
    ...
    typedef PVOID HANDLE;
    ...
    #define DECLARE_HANDLE(name) typedef HANDLE name
    ...
    DECLARE_HANDLE(HBITMAP);
    ...HBITMAP =》void*
      

  2.   

    如果定义成整数,那么所有的HANDLE类型都可以无需转换的通用了,不同HANDLE类型之间的类型区别也就被弱化了,但是定义成这种形式就一定需要一个类型转换。
      

  3.   

    所有HANDLE都是当前机器位长(如32位、64位)的整数值,你可以用任何方式来表达这个值,比如PVOID
      

  4.   

    非也非也,HANDLE有strict和非strict之分的,可以参看<<winnt.h>>#ifdef STRICT
    typedef void *HANDLE;
    #define DECLARE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name
    #else
    typedef PVOID HANDLE;
    #define DECLARE_HANDLE(name) typedef HANDLE name
    #endif
      

  5.   

    定义的这个类型name,是在什么地方?怎么看到?