我看到了一段这样的代码:
#include <windows.h>
static VOID (WINAPI * pFun) (DWORD seconds) = NULL;
void foo(PVOID * par){
return;
}
int main(){
foo(&(PVOID&) pFun); // type-cast 1
foo((PVOID *) (&pFun)); // type-cast 2
return 0;
}
我可以理解类型转换2,但是类型转换1如何工作?
答案 0 :(得分:2)
首先,您正在使用C ++。
windows.h
VOID
和PVOID
分别定义为void
和void*
。
#define VOID void
typedef void *PVOID;
让我们来看一个基本程序:
#include <iostream>
using namespace std;
void foo(void** pp)
{
int i = *((int*) *pp);
cout << i << endl;
}
int main()
{
int i = 10;
int *p = &i;
foo((void**) &p); // call #1
foo(&(void*&) p); // call #2
}
在第一种情况下,我们将p
的地址设为int**
,并将其转换为foo()
,并将其转换为void**
。
在第二种情况下,我们首先将p
投射到void*&
,然后获取其地址void**
,并将其传递给foo()
。它void*&
而非void*
的原因是您只能在lvalue上使用一元&
运算符(地址)。
答案 1 :(得分:0)
(PVOID&) pFun
强制编译器将pFun
视为PVOID
,并获取其地址,有效地传递PVOID*
作为参数。
这种类型的强制转换(TYPE&)
将内存解释为代表TYPE
。
另外,我知道在C ++中你可以通过编写foo
代替&foo
来自动获取函数的地址,不确定它是否支持纯C。