最近在學習 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* 的作用就是用來轉換任意類型的類。 讓外部看不到這個類名