【问题标题】:Function pointer with named arguments?带有命名参数的函数指针?
【发布时间】:2019-09-16 04:44:54
【问题描述】:

我最近在 C 程序中遇到了一个奇怪的语法。

struct connector_agent_api{
    bool (*receive)(slot *s, uint8_t *data, uint8_t length);
}

“接收”是一个函数指针吗?

如果它是一个函数指针,为什么它有命名参数?是不是应该像下面这样?

bool (*receive)(slot *, uint8_t *, uint8_t);

它确实被编译并在一个库中使用。我在互联网上搜索了很多,并试图证明这种语法是合理的。我还是不知道为什么这个东西可以编译... :(

【问题讨论】:

  • 这些名称仅用于自我说明,对功能没有任何意义。
  • 注意这很像头文件中的函数声明,其中参数名称是可选的,对生成的程序没有影响。
  • @EugeneSh。与任何其他不是定义的函数声明相同。

标签: c function pointers


【解决方案1】:

函数指针中的参数名称是可选的,就像函数声明中的参数名称是可选的一样。这是因为如果给定的参数名称没有被使用,所以两种格式都是允许的。

C standard 的第 6.7.6.3 节中,关于函数声明器,其中包括函数原型和函数指针,第 6 段指出:

参数类型列表指定类型,并且可能 为函数的参数声明标识符。

函数参数需要名称的唯一地方是在函数的实际定义中。

对于函数定义,第 6.9.1p5 节指出:

如果声明符包含参数类型列表,则 每个参数的声明应包括一个标识符,除了 对于由单个参数列表组成的特殊情况 void 类型的参数,在这种情况下不应有 标识符。没有申报清单。

【讨论】:

    【解决方案2】:

    是什么让你觉得这是一种奇怪的语法?这是符合 C 标准的有效声明。参数被命名的事实是无关紧要的。在这种情况下,这些参数的命名是可选的。如果您或其他人正在使用 IDE,这将非常有帮助,因为它可以在使用函数指针调用函数时显示完整的原型,从而向编码人员提示要提供的参数。

    【讨论】:

    • 这也很有帮助,因为这种结构用于排序假的类似对象的语法。如果该类型实际上是用于在外部调用函数的类型,则将参数命名为该外部接口文档的一部分会有所帮助。当指针是回调(而不是调用)时,您更有可能看到函数指针带有未命名参数的代码。
    • @SornelHaetir 谢谢!我喜欢你关于回电和呼入的观点。
    猜你喜欢
    • 2015-09-29
    • 1970-01-01
    • 2018-01-03
    • 2018-08-25
    • 2015-09-03
    • 1970-01-01
    • 2012-01-04
    • 2014-04-14
    • 2019-10-20
    相关资源
    最近更新 更多