C 函数声明中的混淆语句

Confusing statement in the C function declaration

我正在研究 STM32 MCU 上 USB 驱动程序的代码实现。我对C语言的理解有点有限,我遇到了这个我不太清楚的函数定义。

static enum usbd_request_return_codes cdcacm_control_request(
usbd_device *usbd_dev __attribute__((unused)),
struct usb_setup_data *req,
uint8_t **buf __attribute__((unused)),
uint16_t *len,
void (**complete)
    (
        usbd_device *usbd_dev,
        struct usb_setup_data *req
    ) __attribute__((unused))
)

我不明白函数声明中的最后一个参数,它似乎实际上是在为该参数定义另一个函数,并将奇怪的两个星号作为参数。有人可以解释这是什么以及如何在实际函数调用中使用它吗?

这个

void (**complete)
    (
        usbd_device *usbd_dev,
        struct usb_setup_data *req
    ) __attribute__((unused))

是指向函数指针的指针声明。该函数具有 return 类型 void 和两个参数。

为了更清楚地考虑下面的演示程序。

#include <stdio.h>

void f( int x, int y )
{
    printf( "x + y = %lld\n", ( long long int )x + y );
}

void g( int x, int y, void ( **fp )( int, int ) )
{
    ( *fp )( x, y );
}

int main(void) 
{
    void ( *fp )( int, int ) = f;
    
    g( 10, 20, &fp );
    
    return 0;
}

程序输出为

x + y = 30

如果没有更广泛的上下文,很难说出为什么使用指向函数指针的指针。可能是因为参数是输出参数。或者可以有一个动态分配的函数指针数组。