Вызов функции без вызова ее параметров внутри другой функции немного сбивает с толку следующим образом:
ppp = pppos_create(&ppp_netif, output_cb, status_cb, 0);
Где output_cb и status_cb являются функциями [...]
output_cb
и status_cb
- это не функция , вызовы , а скорее указатели . Имя функции без заключенного в скобки списка параметров является указателем на функцию, а не ее вызовом. Указатель на функцию позволяет вызывать функцию, не зная, какая функция будет вызываться во время компиляции / компоновки. В этом случае используются как обратные вызовы , так что предопределенная библиотечная функция может вызывать функцию пользовательского приложения.
Простой пример указателя на функцию:
Дано:
int someFunction( int arg )
{
return( arg ) ;
}
Вы можете объявить указатель на функцию fp
переменная таким образом:
int (*fp)(int) = someFunction ;
Затем вы можете вызвать someFunction
функцию через fp
, таким образом:
int x = fp( 2 ) ;
Что печатает status_cb без указания в качестве параметра err_code? Когда или как будут оцениваться status_cb и output_cb?
Аргументы функций предоставляются во время их вызова, а не во время их передачи pppos_create()
. В pppos_create()
они присваиваются output_cb
и ,
link_status_cb parameters respectively. They have type
pppos_output_cb_fn and
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 (я предполагаю, что это функция, связанная с протоколом точка-точка). В этом случае они являются способом обеспечения пользовательской обработки предварительно определенной функции.