puw*_*219 8 c++ macros concatenation c-preprocessor
我无法弄清楚这个宏意味着什么:
#define DECLARE_HANDLE(n) typedef struct n##__{int i;}*n
DECLARE_HANDLE(HWND);
Run Code Online (Sandbox Code Playgroud)
我从C程序中学到了:
"##"表示连接参数.
所以宏等于:
typedef struct HWND__{int i;}*HWND
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
如果是对的,那句话的含义是什么?
==================
来自游戏Bombermaaan(适用于Windows和Linux)的代码,
链接http://sourceforge.net/p/bombermaaan/code/HEAD/tree/trunk/src/Bombermaaan/winreplace.h,
第90行.
Mat*_*son 11
这种结构的主要目的是防止误操作句柄.如果所有句柄都是简单的void *或者int或者是long long其他基本类型,则没有什么可以阻止您使用一个而不是另一个.指向a struct HWND__和指针的指针struct HBITMAP__不是同一个东西,所以如果你有以下代码:
HWND hwnd;
HBITMAP hbmp;
hbmp = GetBitmap(...);
hwnd = hbmp; // gives compiler error.
Run Code Online (Sandbox Code Playgroud)
这是一种相当经典的技术,可确保您获得API供应商不希望提供真实声明的特殊类型.虽然我不完全确定为什么他们甚至需要一个正确的结构声明,你可能会逃脱:
#define DECLARE_HANDLE(n) struct n ## __; struct n ## __ *n;
Run Code Online (Sandbox Code Playgroud)
这也将确保任何解除引用的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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1419 次 |
| 最近记录: |