我看到一段这样的代码:
#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
中,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 上使用一元 &
运算符(地址) .
关于c++ - 这个类型转换意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9658376/