不带参数在函数内部调用函数

calling function inside function without parameters

在另一个函数中调用一个函数而不调用它的参数有点令人困惑,如下所示:

ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);

其中output_cbstatus_cb是没有设置参数的函数,其定义必须写在调用行的上一行

函数定义:

static void status_cb(ppp_pcb *pcb, int err_code, void *ctx) {

    struct netif *pppif = ppp_netif(pcb);

    switch(err_code) {
        case PPPERR_NONE: {
            printf("status_cb: Connected\n");
            printf("   our_ipaddr  = %s\r\n", ipaddr_ntoa(&pppif->ip_addr));
            printf("   his_ipaddr  = %s\r\n", ipaddr_ntoa(&pppif->gw));
            printf("   netmask     = %s\r\n", ipaddr_ntoa(&pppif->
            break;
        }
        case PPPERR_PARAM: {
            printf("status_cb: Invalid parameter\r\n");
            break;
        }
    }
}

static u32_t output_cb(ppp_pcb *pcb, u8_t *data, u32_t len, void *ctx)
{
    return HAL_UART_Transmit_IT(&huart1, data, sizeof(data));
}

int main(void)
{
    ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);
}

如果不提供 err_code 作为参数,status_cb 会打印什么?何时或如何评估 status_cboutput_cb

其中pppos_create定义如下:

ppp_pcb *pppos_create(struct netif *pppif, pppos_output_cb_fn output_cb,
       ppp_link_status_cb_fn link_status_cb, void *ctx_cb)
{
    pppos_pcb *pppos;
    ppp_pcb *ppp;

    pppos = (pppos_pcb *)LWIP_MEMPOOL_ALLOC(PPPOS_PCB);
    if (pppos == NULL) {
        return NULL;
    }

    ppp = ppp_new(pppif, &pppos_callbacks, pppos, link_status_cb, ctx_cb);
    if (ppp == NULL) {
        LWIP_MEMPOOL_FREE(PPPOS_PCB, pppos);
        return NULL;
    }

    memset(pppos, 0, sizeof(pppos_pcb));
    pppos->ppp = ppp;
    pppos->output_cb = output_cb;
    return ppp;
}

亲切的问候

Calling a function without calling its parameters inside another function is a little bit confusing as follows:

ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);

Where output_cb and status_cb are functions [...]

output_cbstatus_cb 不是 函数 调用 ,而是函数 指针。没有括号参数列表的函数名称是指向该函数的指针,而不是对其的调用。函数指针允许在不知道将在 compile/link 时间调用哪个函数的情况下调用函数。在这种情况下,用作 回调 以便预定义的库函数可以调用用户应用程序函数。

一个函数指针的简单例子:

给定:

int someFunction( int arg ) 
{
    return( arg ) ;
}

你可以这样声明一个函数指针fp变量:

int (*fp)(int) = someFunction ;

然后您可以通过 fp 调用 someFunction 函数,因此:

int x = fp( 2 ) ;

What does status_cb print without giving an err_code as a parameter? When or how will status_cb and output_cb be evaluated?

函数的参数在函数被调用时提供,而不是在传递给 pppos_create() 时提供。在pppos_create()中,它们被分配给output_cb,link_status_cbparameters respectively. They have typepppos_output_cb_fnandppp_link_status_cb_fn which will be函数指针类型的 typedef 例如:

typedef void (*ppp_link_status_cb_fn)(ppp_pcb *, int, void*);

在这种情况下pppos_create()不调用这些函数;而是将它们分配给数据结构 ppposppp 的成员,这可能会在相关的 PPP 事件发生时稍后调用(我猜这是一个点对点协议相关函数) .在这种情况下,它们是一种为预定义函数提供用户定义处理的方法。