假设有人想要创建一个可以容纳多个不同类型的函数指针的数组..他将如何去做呢?也许空指针数组可以工作?...事实证明,不行,因为为了使用存储在空指针中的函数,您必须将它们(空指针)转换/转换回函数指针,并且...
“函数指针和 void 指针之间的转换是不可能的。void* 从来都不是函数指针的通用指针类型,仅适用于对象指针。它们不是兼容的类型。
[...]您可以在 void* 和函数指针之间进行转换,但会发生未定义的行为。您将依赖于系统特定的非标准扩展。”
-@伦丁(here https://stackoverflow.com/a/52070955/9302544)
反而...
稍微好一点的方法是使用函数指针类型(例如 void (*)(void))作为通用指针。你可以与不同函数指针之间的转换,将会发生的情况是特定于编译器的(实现定义的行为)。也就是说,代码仍然是不可移植的,但至少您不会因调用未定义的行为而面临程序崩溃的风险。
-@伦丁(here https://stackoverflow.com/a/52070955/9302544)
也就是说,这意味着什么从一个函数指针转换为另一个函数指针 ?
有人可以解释一下吗。也许可以举个例子。
这意味着如果您有两种不同的函数指针类型,例如:
int (*i)(int);
void (*v)(void);
然后,您可以使用显式强制转换从一种类型转换为另一种类型:
v = (void(*)(void))i;
这是允许的,但是调用v()
行不通的。标准是这么说的,C17 6.3.2.3 §8:
指向一种类型的函数的指针可以转换为指向另一种类型的函数的指针,并且
再次回来;结果应等于原始指针。如果使用转换后的指针
调用类型与引用类型不兼容的函数,行为未定义。
因此,如果您尝试通过以下方式调用该函数v();
那么这可能是未定义的行为。但是,您可以转换回原始类型int(*)(int)
而不丢失信息。
这允许您使用特定的函数指针类型作为“通用类型”。而不是使用void*
,正如所讨论的那样,这是不行的here https://stackoverflow.com/a/52070955/584518.
值得注意的是,如果使用 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)