C:函数指针转换甚至是什么?

假设有人想创建一个可以容纳多个函数指针和不同类型的数组 。他将如何这样做呢? 也许一个void指针数组可以工作?…事实certificate,不是因为为了使用存储在void指针中的函数,你必须将它们(void指针)转换/转换回函数指针和…

“函数指针和void指针之间的转换是不可能的.void *从不是函数指针的通用指针类型,仅用于对象指针。它们不是兼容的类型。

[…]你可以在void *和一个函数指针之间进行转换,但是会发生什么是未定义的行为。 您将依赖系统特定的非标准扩展。“

– @ Lundin( 这里 )

代替…

稍微好一点的是使用函数指针类型,如void(*)(void)作为通用指针。 您可以转换为/从不同的函数指针转换 ,将发生的是特定于编译器(实现定义的行为)。 也就是说,代码仍然是不可移植的,但至少你不会冒程序崩溃来调用未定义的行为。

– @ Lundin( 这里 )


也就是说, 从一个函数指针转换到另一个函数指针甚至意味着什么呢?

有人可以解释一下吗。 也许是一个例子。

这意味着如果您有两种不同的函数指针类型,例如:

int (*i)(int); void (*v)(void); 

然后,您可以使用显式强制转换从一种类型转换为另一种类型:

 v = (void(*)(void))i; 

这是允许的,但调用v()将不起作用。 标准说明了这一点,C176.3.2.3§8:

指向一种类型的函数的指针可以被转换为指向另一种类型的函数的指针并且再次返回; 结果应该等于原始指针。 如果转换的指针用于调用类型与引用类型不兼容的函数,则行为未定义。

因此,如果您尝试通过v();调用该函数v(); 那么它可能是未定义的行为。 但是,您可以转换回原始类型int(*)(int)而不会丢失信息。

这允许您将特定的函数指针类型用作“generics类型”。 而不是使用void* ,这不是正常的,如这里所讨论的。


值得注意的是,如果使用typedef,所有带有函数指针的代码都会更容易阅读:

 typedef int int_func (int); typedef void void_func (void); int main() { int_func* i; void_func* v; v = (void_func*) i; i = (int_func*) v; }