这种类型的演员阵容意味着什么
What does this type cast mean?
我看到了这样一段代码:
#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**
,并通过将其强制转换为void**
将其传递给foo()
。
在第二种情况下,我们首先将p
强制转换为void*&
,然后获取其地址,即void**
,并将其传递给foo()
。之所以它是void*&
而不是void*
,是因为您只能在左值上使用一元&
运算符(的地址)。
(PVOID&) pFun
强制编译器将pFun
视为PVOID
,并获取其地址,有效地将PVOID*
作为参数传递。
这种类型的投射(TYPE&)
将存储器解释为好像它表示TYPE
。
此外,我知道在C++中,你可以通过写foo
而不是&foo
来自动获取函数的地址,不确定纯C是否支持它。
相关文章:
- 这行代码在C++类中意味着什么
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- @CPPFLAGS@在 Makefile.in 中意味着什么?
- 生成文件"relink"意味着什么?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- 在这种情况下,"typename..."意味着什么?
- "in-situ without memory allocation" 字符串的愚蠢实现意味着什么?
- 使用typedef有什么用,它意味着什么
- GCC 的 -Wpsabi 选项究竟有什么作用?压制它意味着什么?
- 这在C++ "It does not own the underlying data, and so is cheap to copy or assign"中意味着什么
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 调用堆栈显示 SIGBUS,这意味着什么
- C++标准在[basic.scope.hiding]中"same scope"到底意味着什么?
- 评估对象的创建意味着什么?
- 当我们在 C++ 中说"initialize the object"时,它实际上意味着什么?
- C++这种结构"InterceptionKeyStroke &kstroke = * (InterceptionKeyStroke *) &stroke"意味着什么?
- 该语法在C 中意味着什么
- 链接标志对静态库意味着什么
- 由mpglib输出的"hip: Can't rewind stream by 74 bits"到底意味着什么?
- 这在 C# 中意味着什么以及如何使用它