仅通过名称不带参数调用C函数

时间:2014-09-30 08:28:21

标签: c

我开始研究这个C项目,我发现这个奇怪的代码,我从未见过任何类似的东西!

cas_send_browser_event_cb(cas_browser_event_t ev, void* priv)
   {
      Function_code ...
   }

正如您所看到的,此函数有两个参数,第一个是enum,第二个是void *

我寻找这个函数的调用,我发现了这个:

casware_register_cb_uievent (cas_send_browser_event_cb , NULL);

如您所见,它作为参数传递给另一个没有参数的函数,甚至没有()。我无法理解这段代码。我错过了什么吗? (它与某种程度上与事件编程有关)。

2 个答案:

答案 0 :(得分:4)

casware_register_cb_uievent (cas_send_browser_event_cb , NULL);

传递指向函数casware_register_cb_uievent

的指针

要进一步了解以下代码。

#include<stdio.h>


void hello()
{
        printf("hello world");
}

void world(void (*fun)())
{
         fun();
}

main()
{
        world(hello);
}

此处函数world类似于函数casware_register_cb_uievent

void world(void (*fun)())函数world接受指向fun

指向的函数的指针

现在当函数hello(类似于函数cas_send_browser_event_cb)作为输入给出时,它类似于将指针指定为

fun = hello

函数调用

fun()中的{p> world调用它指向的函数hello 产生输出

hello world

当函数声明为

void (*fun)(); 创建一个函数指针。

可以使用要指向的另一个函数的名称来指定函数指针

fun = hello;

现在在调用指针fun指向函数时,hello是实习生,名为

答案 1 :(得分:1)

通过了function pointer,可能是typedef。这意味着正在传递case_send_browser_event的位置,以便它可以改变casweare_register_cb_uievent函数的行为。

这种传递在算法中非常有用,在这些算法中,您希望在运行中针对不同的事物进行最大化,因此更改用于从最小化到最大化进行比较的布尔函数将为a提供相反的行为。排序算法。