传递函数指针的正确方式以及它们之间的区别

标签 c callback function-pointers

<分区>

阅读有关函数指针的内容,出现了一个问题,我在 stackoverflow 上找到了一些答案,但我还是不明白。

那么,这些代码有什么区别呢? 编译器看到了什么? 是否有正确的方法或良好的编程习惯来执行此操作?

#include<stdio.h>

int sum(int a, int b);
void handle(int a, int b, int (*func)(int, int));

int main()
{
    handle(1, 2, sum); /*Here the third argument can be sum or &sum*/

    return 0;
}

void handle(int a, int b, int (*func)(int, int))
{
    printf("\nResult: %d.\n\n", func(a, b)); /*Here the second argument can be func(a, b) or (*func)(a, b)*/
}

int sum(int a, int b)
{
    return a + b;
}

我可以通过两种方式调用句柄:

handle(1, 2, sum);
handle(1, 2, &sum);

在句柄中,我可以通过两种方式调用 printf:

printf("\nResult: %d.\n\n", func(a, b)); 
printf("\nResult: %d.\n\n", (*func)(a, b));

所有这些方式都可以组合,所以我们有4种不同的组合方式。

谢谢!

最佳答案

形式上,两者都一样正确,在实践中,您可能会看到其中一个被使用。

我个人会使用:

handle(1, 2, sum);

printf("\nResult: %d.\n\n", func(a, b));

因为我认为无关的运算符不会增加任何值(value)。

关于传递函数指针的正确方式以及它们之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30586007/

相关文章:

c++ - 创建这样的控件

javascript - jQuery 像这样返回

c++ - 为什么我们需要在运行时使用函数指针调用这些函数。我们也可以直接调用他们

通过地址 C 调用函数

c++ - 如何在 unordered_map 的键中使用 std::tr1::function 对象?

c - 使用带有标准输入的 fgets() 作为输入 : ^D fails to signal EOF

c++ - 如何在 *C* 中围绕命令行程序编写 GUI 包装器?

c - 使用指针交换两个数字的程序出错

java - 在 GWT 中创建模态对话框

linux - 将函数指针从内核驱动程序传递到管理程序