C ++-17:将函数指针转换为具有不同参数指针类型的函数

时间:2020-03-11 17:38:24

标签: c++ c++17 function-pointers

我有一个传统的C-API,它提供了异步操作的回调。 由于该库需要很多编译器标志,并且充满了宏,并且标头包含在内,标头会产生大量警告,因此我决定为此库创建一个包装专有C库的包装器。

但是由于该库是异步的,所以它提供了回调函数。 问题在于,回调需要指向结构(test)的指针。 但是由于该结构是旧API的一部分,并且我不想包含该结构, 我决定创建具有相同布局X_leg的结构。 在main()中,确保两个结构的大小相等。

我的问题是: 将X_wrp类型的包装函数指针reinterpret_cast到类型为func_wrp的遗留函数指针是否安全? 还是C ++ 17中未定义的行为?

我有以下最低限度的工作示例:

func_leg

1 个答案:

答案 0 :(得分:1)

否,这并不安全,在[expr.call]/6

中被明确定义为未定义的行为

通过表达式调用函数,该表达式的函数类型不同于被调用函数定义的函数类型,将导致未定义的行为。

reinterpret_cast文档中有关函数指针转换[expr.reinterpret.cast]/6

的内容也得到了加强。

可以将功能指针显式转换为其他类型的功能指针。 [注意:通过指向与函数定义中使用的类型不同的函数类型([dcl.fct])的指针调用函数的效果未定义([expr.call])。 —尾注]除了将类型为“ pointer to T1”的prvalue转换为“ pointer to T2”(其​​中T1和T2是函数类型)并返回其原始类型会产生原始指针值,这种处理的结果指针转换未指定。 [注意:有关指针转换的更多详细信息,另请参见[conv.ptr]。 —尾注]