【发布时间】:2014-05-20 22:06:10
【问题描述】:
在 C 中,您可以将函数指针放入 void 指针数组中,然后将它们转换回任何类型的函数指针:
extern int (*fn1)(void);
extern void (*fn2)(int);
void foo(void)
{
void *array[2];
int i;
/* implicit cast from function pointer to void pointer */
array[0] = fn1;
array[1] = fn2;
for (i = 0; i < 2; i++)
{
int (*fp)(int, int, int);
/* implicit cast from void pointer to function pointer */
fp = array[i];
/* call function with a different signature */
fp(1, 2, 3);
}
}
我需要在 Go 中做同样的事情,使用 unsafe.Pointers。问题是:
- 可以将 Go 函数指针转换为 unsafe.Pointer 吗?
- 能否将 unsafe.Pointer 转换为与原始函数指针不同(或相同)类型的 Go 函数指针?
(问题是不是为什么或是否需要这样做;在给定的情况下,可以使用错误的参数集调用函数并误解返回值,因为调用者并且被调用者能够处理它。)
【问题讨论】:
-
我回答:是的,它有效,但我不得不承认我非常好奇你为什么需要这样做。
-
因为我正在 gccgo 中的 gofrontend 上工作,并且需要以树表示形式生成人工代码,以从完全相同的地址调用多个函数。我并不是真的在编写 Go 代码,但如果我能坚持使用已经在前端的用于解析 Go 源代码的类,那就少了很多工作。
-
你不能在 C 中这样做。这是未定义的行为,一个好的编译器应该警告你。由于一系列非常好的原因,函数指针与数据指针不兼容。
标签: go function-pointers unsafe-pointers