相关疑难解决方法(0)

将函数指针转换为另一种类型

假设我有一个接受void (*)(void*)函数指针的函数用作回调函数:

void do_stuff(void (*callback_fp)(void*), void* callback_arg);
Run Code Online (Sandbox Code Playgroud)

现在,如果我有这样的功能:

void my_callback_function(struct my_struct* arg);
Run Code Online (Sandbox Code Playgroud)

我可以安全地这样做吗?

do_stuff((void (*)(void*)) &my_callback_function, NULL);
Run Code Online (Sandbox Code Playgroud)

我已经看过这个问题并且我已经看过一些C标准,它们说你可以转换为'兼容函数指针',但我找不到'兼容函数指针'的含义.

c function-pointers

81
推荐指数
4
解决办法
8万
查看次数

转换函数指针

我正在编写一个函数,它接收一个指向比较函数的指针和一个数组,MyStructs并且应该根据比较函数对数组进行排序:

void myStructSort(
                  struct MyStruct *arr,
                  int size,
                  int (*comp)(const struct MyStruct *, const struct MyStruct *)) {
  qsort(arr, size, sizeof(struct MyStruct), comp);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这不会编译,因为qsort期望比较器接收void *参数而不是const struct MyStruct *.我想到了几个不好的解决方案,并想知道正确的解决方案是什么.

选项1

铸造compint (*)(const void *, const void*).这编译但是未定义的行为(参见这个问题).

选项2

创建一个全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *),并设置global_comp=comp里面myStructSort.然后创建一个函数:

int delegatingComp(const void *a, const void *b) {
  return globalComp((const struct MyStruct *)a, (const …
Run Code Online (Sandbox Code Playgroud)

c function-pointers qsort

15
推荐指数
2
解决办法
1676
查看次数

标签 统计

c ×2

function-pointers ×2

qsort ×1