[英]What is the meaning of this C++ macro?
我無法弄清楚這個宏意味着什么:
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
DECLARE_HANDLE(HWND);
我從C程序中學到了:
“##”表示連接參數。
所以宏等於:
typedef struct HWND__{int i;}*HWND
這是正確的嗎?
如果是對的,那句話的含義是什么?
==================
游戲Bombermaaan的代碼(適用於Windows和Linux),
鏈接http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h ,
第90行。
這種結構的主要目的是防止誤操作句柄。 如果所有句柄都是void *
或int
或long long
或其他基本類型,則沒有什么可以阻止您使用一個而不是另一個。 一個指向struct HWND__
和指針struct HBITMAP__
是不一樣的東西,所以如果你有以下代碼:
HWND hwnd;
HBITMAP hbmp;
hbmp = GetBitmap(...);
hwnd = hbmp; // gives compiler error.
這是一種相當經典的技術,可確保您獲得API供應商不希望提供真實聲明的特殊類型。 雖然我不完全確定為什么他們甚至需要一個正確的結構聲明,你可能會逃脫:
#define DECLARE_HANDLE(n) struct n ## __; struct n ## __ *n;
這也將確保任何解除引用的HWND都是不可能的,因為編譯器將反對“使用不完整類型”。
你的假設是正確的。
您可以使用以下簡單的測試代碼進行檢查。
DECLARE_HANDLE(HWND);
struct HWND__ s;
HWND p = (HWND) malloc(sizeof(struct HWND__));
s.i = 20;
p->i = 100;
cout << "i valueis " << s.i<<" and " << p->i <<endl;
究竟。
這用於聲明指向您不知道的結構的不透明指針。
我不知道他們為什么不簡單地宣布它為一個
typedef void* HWND;
可能是對齊問題,因為結構可以對齊但不是基本類型 。
如上所述,將類型聲明為結構允許進行一些編譯時類型檢查。
聰明!
它將HWND
定義為包含int i
struct HWND__
的指針。
所以,現在你可以在代碼中使用類型HWND
。
DECLARE_HANDLE(HWND);
確實擴展到了
typedef struct HWND__{int i;}*HWND;
現在,你在問這意味着什么? 只需將typedef拆分為兩個步驟:
struct HWND__
{
int i;
};
typedef HWND__* HWND; // C++ only; for both C++ and C: typedef struct HWND__* HWND;
因此,它定義了一個包含int
(名為i
)的結構HWND__
,並將類型別名HWND
聲明為指向HWND__
指針 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.