这种类型的演员是什么意思?

时间:2012-03-11 19:57:55

标签: c++ c type-conversion

我看到了一段这样的代码:

#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如何工作?

2 个答案:

答案 0 :(得分:2)

首先,您正在使用C ++。

windows.h VOIDPVOID分别定义为voidvoid*

#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。