void * 的使用以及作用
最近在学习 windows api 编程, 在学习过程中用到了很多 HWND ,HANDLE 等。
查看了定义才发现其实就是 void*
在头文件中 有一个宏
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
这个到底是什么意思呢?
其实可以把 ## 看成是 黏贴 连接符, 把上面翻译出来就是:
比如外部调用了 DECLARE_HANDLE(HMYHANDLE);
struct HMYHANDLE_
{
int unused;
};
typedef struct HMYHANDLE_*HMYHANDLE;
其实就是把 名字传进来, 然后重新定义了一个结构体 指针。
由于改结构体中, 只有一个 int 数据成员, 所以 unused 的地址, 也是 结构体的地址。
例如:
CMyFile* pFileAccess = new CMyFile(&m_fileReader)
HMYHANDLE pDocument;
pDocument = (HMYHANDLE)pFileAccess
如果后面要使用CMyFile 的时候, 可以通过
CMyFile* mFileAccess = (CMyFile*)&pDocument->unused;
或者CMyFile* mFileAccess = (CMyFile*)&pDocument
都是可以的。
总之 ,void* 的作用就是用来转换任意类型的类。 让外部看不到这个类名