我有一个传统的C-API,它提供了异步操作的回调。 由于该库需要很多编译器标志,并且充满了宏,并且标头包含在内,标头会产生大量警告,因此我决定为此库创建一个包装专有C库的包装器。
但是由于该库是异步的,所以它提供了回调函数。
问题在于,回调需要指向结构(test
)的指针。
但是由于该结构是旧API的一部分,并且我不想包含该结构,
我决定创建具有相同布局X_leg
的结构。
在main()中,确保两个结构的大小相等。
我的问题是:
将X_wrp
类型的包装函数指针reinterpret_cast
到类型为func_wrp
的遗留函数指针是否安全?
还是C ++ 17中未定义的行为?
我有以下最低限度的工作示例:
func_leg
答案 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]。 —尾注]