0

我知道函数回调是在另一个函数的调用中嵌入另一个函数指针,如下所示:

函数声明:

function_call_back(int x, int y, void (*functonPtr)(int x, char y , struct newStruct* sptr))


void func(int x , char y , struct newStruct* sptr1)
{
    //perform Algorithm 1 on x,y ,sptr1
}

void func2(int x , char y , struct newStruct* sptr2)
{
    //perform Algorithm 1 on x,y ,sptr2
}


void func3(int x , char y , struct newStruct* sptr3)
{
    //perform Algorithm 1 on x,y ,sptr3
}

void func4(int x , char y , struct newStruct* sptr4)
{
    //perform Algorithm 1 on x,y ,sptr4
}

main()
{
    // function calling 
    function_call_back(23, 2256, func1);
}

这里的第三个参数是func,因为函数名等价于函数指针

我同意func这里可以通过在调用 function_call_back 之前在上面的 main 中添加这一行来改变类似函数签名的不同变体:

 typedef void (*fptr)(int int x , char y , struct newStruct* ptr);

  fptr f1 = func2; // or func3, or func4

  function_call_back(23, 2256, f1);

第三个参数是func,作为函数名称,但我想知道这也可以通过以下方式实现,只需在调用中添加函数调用代码function_call_back

function_call_back(23, 2256, functionCallingcode); //third argument is func 

的新声明function_call_back是:

function_call_back(int x, int y, int functionCallingCode)

它的新定义是:

void function_call_back(int x, int y, int functionCallingCode)
{
switch(functionCallingCode)
case 1:
func1(1,"g",sptr1);
break;

case 2:
func2(1,"c",sptr2);

break

case 3:
func3(1,"d",sptr3);
break;

case 4 : 
func4(1,"s",sptr4);
break ;

default : 
 printf("Wrong Function calling code");

}
}

那为什么要使用函数指针呢?

4

3 回答 3

3

使用 switch 语句,您可以调用您选择编码到回调函数中的每个函数。您可以保证只有一个已知的函数集合可以被调用。

使用函数指针,您可以调用您以后可能在开发中完全不相关的点定义的任何函数。您可以自由定义和使用任何具有匹配签名的回调函数。

换句话说,开关允许您在有限的一组选择中进行分支,而函数指针则为您提供无限的灵活性。通常没有什么理由比函数指针更喜欢其他任何东西。

于 2012-05-06T14:31:15.350 回答
3

它们并不好,它们实际上是您唯一的选择。

您可以进行此切换,但以相同的方法,您可以将整个程序编写在一个函数中。函数用于分隔代码单元,而这个“切换函数”只是单元太多东西。

于 2012-05-06T13:52:09.793 回答
2

在您描述的情况下,您可以清楚地获得所需的功能,而无需使用函数指针。

但是,请考虑如果您想在几周内添加 func5 选项会发生什么。然后随着时间的推移,您想要添加 func6、func7、...、func10、func20。function_call_back() 变得更大更混乱,而使用函数指针版本,您可以添加任意数量的不同功能,而无需编辑 function_call_back()。

函数指针实现还为您提供了将 function_call_back() 打包为库的一部分的灵活性,您或其他任何人都可以在另一个程序中使用它,而不必弄乱甚至拥有源代码。请参阅标准库 qsort 函数以了解为什么这非常方便的示例。

于 2012-05-06T14:18:07.877 回答