我最近在C程序中遇到了一个奇怪的语法。
struct connector_agent_api{
bool (*receive)(slot *s, uint8_t *data, uint8_t length);
}
是“接收”一个函数指针吗?
如果它是一个函数指针,为什么它有命名参数?应该是下面的样子吗?
bool (*receive)(slot *, uint8_t *, uint8_t);
当然可以编译并在库中使用。我在互联网上进行了大量搜索,并试图证明这种语法的合理性。我仍然不知道为什么这个东西可以编译...:(
答案 0 :(得分:18)
函数指针中的参数名称是可选的,就像函数声明中的参数名称是可选的一样。这是因为未使用参数名称(如果给定),所以两种格式都允许。
在C standard的有关函数声明符的6.7.6.3节中,其中包括函数原型和函数指针,第6段指出:
参数类型列表指定了类型,并且可以 声明该函数的参数的标识符。
函数参数唯一需要名称的地方是函数的实际定义。
对于函数定义,第6.9.1p5节规定:
如果声明符包括参数类型列表,则 每个参数的声明应包括一个标识符,除了 对于由单个参数组成的参数列表的特殊情况 类型为void的参数,在这种情况下,不得存在 标识符。没有声明清单。
答案 1 :(得分:4)
是什么让您觉得这是一种奇怪的语法?根据C标准,它是有效的声明。参数被命名的事实是无关紧要的。在这种情况下,此类参数的命名是可选的。如果您或其他人正在使用IDE,则可能会非常有用,因为它可以在使用函数指针调用函数时显示完整的原型,从而向编码器提示要提供的参数。