【发布时间】:2015-05-20 13:20:03
【问题描述】:
我明白你为什么不能这样做:
void(*fp)(void) = &function;
function_taking_void_pointer((void*)fp);
因为类型的长度可能不同。
但是添加另一层间接有什么问题:
void(*fp)(void) = &function;
void(**fpp)(void) = &fp;
function_taking_void_pointer((void*)fpp)
我的想法是:指向函数指针的指针应该指向数据内存,因此应该与 void* 类型具有相同的长度。
那我到底错在哪里?
【问题讨论】:
-
上帝帮助那些在你完成后必须阅读这段代码的人......
-
当然 void 指针是为这些类型的“黑客”制作的。但我想它绝对没有好的设计将函数指针传递给一个函数,该函数可能是为了处理不同的数据类型,如 int*、float*、double*、struct 不管*等。所以我认为你最好写一个参数是指向函数的指针的函数。
-
好吧,那么别提这些奇怪的东西了。
-
请记住,函数指针可以存储在任何其他函数指针中(通过强制转换),只要它在用于进行函数调用之前转换回正确的函数指针类型。所以你可以使用
void (*)(void)(或任何函数指针类型)作为函数指针的一种“void*”。 -
此外,由于
dlsym()函数的指定方式,POSIX 排序要求函数指针可以通过void*往返。
标签: c pointers function-pointers