允许将任何对象指针转换为void *
,但这不会传递到函数指针中的参数和返回类型.
指向函数somestruct* function_A(void*)
的指针与类型void* (*function_pointer)(void*)
的函数指针不兼容,因为返回类型不兼容.试图通过不兼容的指针类型调用函数将触发undefined behavior.
关于如何确定两种函数类型是否兼容的规则在C standard:
For two function types to be compatible, both shall specify compatible
return types.此外,如果参数类型和参数类型都是
目前,应就参数的数量和使用达成一致
省略号终止符;对应的参数应兼容
类型.如果一种类型具有参数类型列表,而另一种类型为
由不是函数一部分的函数声明符指定
定义,并包含一个空标识符列表、参数
列表不应包含省略号终止符以及每个
参数应与从
应用默认参数提升.如果一种类型具有
参数类型列表,另一种类型由函数指定
包含(可能为空的)标识符列表的定义,两者
应就参数的数量和每个参数的类型达成一致
原型参数应与产生的类型兼容
从默认参数提升的应用程序到
相应的标识符.(在类型的确定中
兼容性和复合类型,每个参数都用
函数或数组类型被视为具有调整后的类型,并且每个
使用限定类型声明的参数被视为具有其声明类型的非限定版本.)
粗体部分是与本例相关的部分. void *
和和 struct 体指针是不兼容的,即使允许在两者之间转换.
6.3.2.3p8节详细说明了函数指针转换的规则:
指向一种类型的函数的指针可以转换为指向
另一种类型的函数,然后再返回;结果将进行比较
等于原始指针.If a converted pointer is used to call
a function whose type is not compatible with the referenced type, the
behavior is undefined.个
最后一节用粗体表示,你试图做的事情是不允许的.
您需要将函数的返回类型更改为void *
,以与函数指针类型兼容.然而,强制转换返回类型并不是必需的,因为在没有返回类型的情况下允许在对象指针和void *
之间进行转换.