不带参数在函数内部调用函数
calling function inside function without parameters
在另一个函数中调用一个函数而不调用它的参数有点令人困惑,如下所示:
ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);
其中output_cb
和status_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_cb
和 output_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_cb
和 status_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 type
pppos_output_cb_fnand
ppp_link_status_cb_fn which will be
函数指针类型的 typedef 例如:
typedef void (*ppp_link_status_cb_fn)(ppp_pcb *, int, void*);
在这种情况下pppos_create()
不调用这些函数;而是将它们分配给数据结构 pppos
和 ppp
的成员,这可能会在相关的 PPP 事件发生时稍后调用(我猜这是一个点对点协议相关函数) .在这种情况下,它们是一种为预定义函数提供用户定义处理的方法。
在另一个函数中调用一个函数而不调用它的参数有点令人困惑,如下所示:
ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);
其中output_cb
和status_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_cb
和 output_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_cb
和 status_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 type
pppos_output_cb_fnand
ppp_link_status_cb_fn which will be
函数指针类型的 typedef 例如:
typedef void (*ppp_link_status_cb_fn)(ppp_pcb *, int, void*);
在这种情况下pppos_create()
不调用这些函数;而是将它们分配给数据结构 pppos
和 ppp
的成员,这可能会在相关的 PPP 事件发生时稍后调用(我猜这是一个点对点协议相关函数) .在这种情况下,它们是一种为预定义函数提供用户定义处理的方法。