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

C:什么是函数指针转换?,c,type-conversion,function-pointers,C,Type Conversion,Function Pointers,假设有人想创建一个数组,该数组可以容纳多个不同类型的函数指针。。他将如何着手这样做?也许一组空指针可以工作?。。。事实证明,没有,因为为了使用存储在void指针中的函数,必须将它们(void指针)转换/强制转换回函数指针,然后 函数指针和void指针之间的转换是不可能的。void*从来不是函数指针的通用指针类型,只是对象指针。它们是不兼容的类型 […]您可以在void*和函数指针之间强制转换,但会发生未定义的行为。您将依赖于特定于系统的非标准扩展。” -@伦丁() 相反 稍微好一点的方法是使用函

假设有人想创建一个数组,该数组可以容纳多个不同类型的函数指针。。他将如何着手这样做?也许一组空指针可以工作?。。。事实证明,没有,因为为了使用存储在void指针中的函数,必须将它们(void指针)转换/强制转换回函数指针,然后

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

[…]您可以在void*和函数指针之间强制转换,但会发生未定义的行为。您将依赖于特定于系统的非标准扩展。”

-@伦丁()

相反

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

-@伦丁()


也就是说,从一个函数指针转换到另一个函数指针是什么意思


有人能解释一下吗。举个例子。

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

int (*i)(int);
void (*v)(void);
然后,您可以使用显式转换从一种类型转换为另一种类型:

v = (void(*)(void))i;
这是允许的,但是调用
v()
将不起作用。本标准规定,C17 6.3.2.3§8:

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

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

这允许您将特定函数指针类型用作“泛型类型”。而不是使用
void*
,正如前面讨论的那样,这是不好的


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

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;
}

关于你所说的@Lundin.So,换句话说,如果我理解正确,如果我错了,请纠正我,你可以将a类型的函数指针作为B类型的函数指针进行传输,然后在需要时(a类型)将其转换回来。因此,对于前面讨论的问题,应该做的是,创建一个“泛型函数指针”数组,将函数转换为该泛型类型,并将其存储在数组中,然后在需要使用时将其转换回@当然,您必须以某种方式跟踪函数的实际类型。