将 void (*p)(SomeType*) 转换为 void (*p)(void*) 是否安全?
Is it safe to cast void (*p)(SomeType*) to void (*p)(void*)
假设我有一个如下函数:
void fun(void* p){
SomeType* p = reinterpret_cast<SomeType*>(p);
...
}
API 需要签名。我只是想知道我能不能把它写成。
void fun(SomeType* p){
...
}
并将其投射到void (*)(void*)
.
虽然可以将函数指针强制转换为其他函数指针并返回,但通过与其签名不匹配的指针调用函数是未定义的行为。您不能只是强制转换它并传递给 API。
在 C 和 C++03 中,您必须创建一个与签名匹配并预执行强制转换的命名包装函数。在 C++11 及更高版本中,您可以改用无捕获的 lambda(正确转换(:
void fun(SomeType* p){
...
}
int main() {
api_call(+[](void *v) {
fun(static_cast<SomeType*>(v));
});
}
lambda 前面的+
会导致它被转换为常规函数指针,只要它没有捕获。这不是严格需要的,但它使意图更加明确 IMO,没有太多冗长。
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- 逐字节删除 void* 是否安全?
- 用非零值初始化void指针的正确(或最安全)方法
- 将 void (*p)(SomeType*) 转换为 void (*p)(void*) 是否安全?
- 将 C++ 对象强制转换为 void* 的安全/标准方法
- 在void*和void*之间进行强制转换时,混合使用静态强制转换和重新解释强制转换是否不安全?
- 在需要void*参数的函数中传递unique_ptr最安全的方法是什么?
- 将deque转换为void指针是否安全
- 将派生对象存储到void*中,然后从中抛出基对象是否不安全
- 将void*转换为更高的东西的安全方法