c - C 函数声明中的混淆语句
问题描述
我正在通过 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))
是指向函数指针的指针的声明。该函数具有返回类型 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
如果没有更广泛的上下文,很难说为什么要使用指向函数的指针。可能是因为参数是输出参数。或者可以有一个动态分配的指向函数的指针数组。
推荐阅读
- amazon-web-services - 如何使用 aws cognito response_code form saml redirect 从 cognito 获取用户信息?
- regex - 正则表达式来计算和打印匹配的字符
- java - 如何在opencv中对齐文本并使其变为黑白?
- javascript - Express res.locals 和 pug 没有按预期工作
- python - 当列名是数字(不是字母)时,如何在 jupyter notebook 中导入列名?
- python - 查找与给定数字具有最接近值的行
- asp.net-core - 没有可用的架构 graphiql aspnet 核心
- node.js - 用户在节点 js 中提交后如何显示验证消息错误?
- shell - 匹配后删除字符串并排除空换行符
- docker-compose - 在 docker 中使用标签配置 traefik 不起作用?