这种类型的演员阵容意味着什么

What does this type cast mean?

本文关键字:意味着 什么 种类 类型      更新时间:2023-10-16

我看到了这样一段代码:

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

首先,您使用的是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**,并通过将其强制转换为void**将其传递给foo()

在第二种情况下,我们首先将p强制转换为void*&,然后获取其地址,即void**,并将其传递给foo()。之所以它是void*&而不是void*,是因为您只能在左值上使用一元&运算符(的地址)。

(PVOID&) pFun强制编译器将pFun视为PVOID,并获取其地址,有效地将PVOID*作为参数传递。

这种类型的投射(TYPE&)将存储器解释为好像它表示TYPE

此外,我知道在C++中,你可以通过写foo而不是&foo来自动获取函数的地址,不确定纯C是否支持它。