【问题标题】:C: What even is function pointer conversion? [closed]C:什么是函数指针转换? [关闭]
【发布时间】:2019-02-03 23:50:45
【问题描述】:

假设一个人想要创建一个可以容纳多个不同类型的函数指针的数组..他会怎么做呢?也许 void 指针数组可以工作?...事实证明,不,因为为了使用存储在 void 指针中的函数,您必须将它们(void 指针)转换/转换回函数指针和...

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

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

-@Lundin (here)

相反...

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

-@Lundin (here)


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

谁能解释一下。或许可以举个例子。

【问题讨论】:

  • 关于你所说的@Lundin。

标签: c type-conversion function-pointers


【解决方案1】:

表示如果你有两种不同的函数指针类型,例如:

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

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

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

这是允许的,但调用 v() 将不起作用。标准是这样说的,C17 6.3.2.3 §8:

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

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

这允许您使用特定的函数指针类型作为“通用类型”。而不是使用void*,这是不行的,正如here所讨论的那样。


值得注意的是,如果使用 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;
}

【讨论】:

  • 所以,换句话说,如果我理解正确,如果我错了,请纠正我,您可以将 A 类型的函数指针作为 B 类型的函数指针进行传输,然后当你需要它(typeA)时,你把它转换回来。
  • 所以对于前面的事情,讨论here,应该做的是,创建一个“泛型函数指针”数组,将函数转换为这种泛型类型并将它们存储在数组,然后在需要使用时将它们转换回来......?
  • @notAymen 确实,尽管您必须以某种方式跟踪函数的实际类型。
猜你喜欢
  • 2020-10-07
  • 1970-01-01
  • 2011-07-31
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 2015-03-26
  • 2012-11-21
  • 1970-01-01
相关资源
最近更新 更多