正如我所听说的,将指针转换为函数是不安全的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*?
正如我所听说的,将指针转换为函数是不安全的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 标准不保证 astruct foo *
和 avoid *
具有相同的大小和格式。通常,将函数指针转换为其他函数指针类型是灾难的根源。安全的解决方案是插入一个额外的函数,将参数转换为正确的类型,就像为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);
}
(正如 Oli Charlesworth 在评论中所写,演员表本身不是问题,但通过指针调用会导致 UB。)