KAc*_*ion 4 c gcc function-pointers function
正如我所听到的,将指针转换为函数是不安全的void*.
好的,施放是否安全
void (*enumerate) (void (*)(const struct foo *event, void *), void *)
至
void (*enumerate) (void (*)(const void *event, void *), void *)
然后用它来调用它
void (*)(const void *, void *) 作为第一个参数,它将其第一个void*视为struct foo*?
不,这不安全.C标准不保证a struct foo *和a void *具有相同的大小和格式.通常,向其他函数指针类型的转换函数指针是灾难的处方.安全的解决方案是插入一个额外的函数,将参数转换为正确的类型,就像编写qsort处理非void *参数的比较函数时一样:
static int compare_foo_as_voidp(void const *a, void const *b)
{
return compare_foo((struct foo const *)a, (struct foo const *)b);
}
Run Code Online (Sandbox Code Playgroud)
(正如奥利查尔斯沃思在评论中所写,演员本身不是问题,但通过指针调用会导致UB.)