如何将 void(*)() 类型的指针转换为 void*
How to convert a pointer of type void(*)() to void*
如何将类型void(*)()
的指针转换为void *
?
是否可以使用以下任何运算符来执行此操作?
const_cast
static_cast
dynamic_cast
reinterpret_cast
示例:以下所有内容都已编译(在Visual Studio 2017中尝试(,我想知道它们在转换后是否都具有相同的结果。
void operation(void(*callback)()) {
void* test1 = callback;
void* test2 = static_cast<void*>(callback);
void* test3 = reinterpret_cast<void*>(callback);
}
在 ISO 标准C++中,没有从任何函数指针类型到任何对象指针类型的隐式转换。 所以这条线是错误的。
void* test1 = callback;
对于编译器来说,在没有诊断的情况下接受这一点是一个错误1(您确实启用了警告,对吗?
在标准C++中,禁止在任何对象指针类型和函数指针类型(任一方向(之间进行static_cast
。 控制规则可在 5.2.9 中找到:
否则,
static_cast
应执行下列转换之一。不得使用static_cast
明确执行其他转换。
由于上面或下面的规则都没有讨论函数指针强制转换,因此禁止该行
void* test2 = static_cast<void*>(callback);
但是,这不一定是单独的编译器错误,因为其中一个规则确实允许使用static_cast
来完成任何隐式转换。
最后一行是唯一正确的:
void* test3 = reinterpret_cast<void*>(callback);
控制规则在reinterpret_cast
规范中提供 (5.2.10(
条件地支持将函数指针转换为对象指针类型,反之亦然。这种转换的含义是实现定义的,除了如果实现支持双向转换,则将一种类型的 prvalue 转换为另一种类型并返回(可能具有不同的 cv 限定(应生成原始指针值。
1当使用/Za
启用符合标准的模式时,Microsoft C++编译器会正确拒绝复制初始化并static_cast
尝试:
source_file.cpp(8(: 错误 C2440:"正在初始化": 无法从
void (*)(void)
转换为void *
source_file.cpp(8(:注意:指向的类型不相关;转换需要reinterpret_cast,C 样式转换 或功能样式转换
source_file.cpp(9(: 错误 C2440:
static_cast
: 无法从void (*)(void)
转换为void *
source_file.cpp(9(: 注意:指向的类型不相关;转换要求 reinterpret_cast、C 型演员表或功能型演员表
在标准C++中,从 C++11 开始,它是有条件支持的,这意味着实现可能支持也可能不支持它,并且必须记录它是否受支持。
对于支持此强制转换的实现,要使用的适当强制转换运算符是reinterpret_cast
。详细信息可以在C++14标准[expr.reinterpret.cast]/8中找到。
尝试将函数指针转换为没有强制转换 ([conv.ptr]( 或static_cast
的对象指针 ([expr.static.cast]/5( 是错误的。 如果编译器在标准模式下允许此操作,并且未发出诊断,则编译器不符合要求。
- 如何在 C++ 中将 void 函数传递给 void 指针
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- C++为 void 指针分配一个字符串
- 为什么在将 void 指针转换为整数指针时出现分段错误
- 取消引用 void 指针以将值分配给结构
- C 与 C++,处理 void** 指针
- 除了调用全局删除运算符之外,删除一个void指针还能做什么呢
- 用非零值初始化void指针的正确(或最安全)方法
- 将 void 指针分配给另一个 void 指针
- c ++ 我是否需要手动删除指向另一个具体类型的 void* 指针?
- 如何将 std::string 作为构造函数参数传递,并将其保存的 C 字符串存储在 void 指针中?
- 如何将 std::string 赋回作为 <char>void* 指针传递的 std::vector.data()?
- 将指针传递到结构,与传递 void 指针并强制转换为结构
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 用于初始化结构的 void 指针强制转换
- 使用 void 指针:void **ptr.. 如何修改共享内存的值?
- 访问由 void 指针引用的结构的成员
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 如何警告 C 中 void 指针上的参数不兼容的类型
- 指向类模板方法的 void 指针的向量