簡體   English   中英

這個C ++宏是什么意思?

[英]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 *intlong 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM