繁体   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