【问题标题】:When do we need & when passing a function?我们什么时候需要&什么时候传递一个函数?
【发布时间】:2011-09-20 06:03:10
【问题描述】:

我发现了这些工作类型的代码:

hash_init.key       = &hash_key_lc;  

ls->handler = init_connection;

这里hash_key_lcinit_connection都是函数,但是一个是&另一个不是,为什么?

更新

所以它们是一样的,但有什么道理呢??

【问题讨论】:

标签: c function-pointers


【解决方案1】:

参见 C99 第 6.3.2.1 节,第 4 节:

功能指示符是一个 具有函数类型的表达式。 除非它是 sizeof 运算符或一元 & 运算符,一个函数指示符 type ‘‘函数返回type’’是 转换为具有 type ‘‘指向函数返回的指针 类型''。

因此,如果foo 是一个函数,则表达式foo&foo 大多可以互换,尤其是

foo == &foo

这类似于数组类型的表达式隐式转换为指针类型的表达式。另外,如果fp 是一个函数指针,你可以在有或没有解引用的情况下调用它,即表达式

(*fp)(42)

fp(42)

是等价的。函数调用实际上是根据函数指针(第 6.5.2.2 节第 1 节)而不是函数指示符定义的,即就语言语义而言,第一个示例中的 *fp 将在括号之前隐式转换回 fp已申请。

【讨论】:

    【解决方案2】:

    function 上的reference/deferencec 中被视为语言特例,因为function 值得这种特例,它不能被某个value 通过,你只能通过address/reference传递它。

    【讨论】:

      【解决方案3】:

      这与以下问题相同: In C, what is the difference between `&function` and `function` when passed as arguments?

      那里接受的答案:

      没有区别。为了证据 见C99 specification(部分 6.7.5.3.8)。

      "将参数声明为 “函数返回类型”应为 调整为“函数指针” 返回类型'',如 6.3.2.1。”

      【讨论】:

      • @Mike,但这并不一致,指针(*)和指针指针(**)怎么可能没有区别?
      • 将重复项发布为 cmets,而不是答案,如果您有足够的代表,请投票关闭。 -1
      • @new_perl - 不是void (*)(void)(指向函数的指针)和void(**)(void)(指向函数的指针),而是void(void)(函数)和void (*)(void)。当作为参数传递时,函数将转换为指向函数的指针。
      • @Chris Lutz ,你不认为这使它在语法上不一致吗?我看不出这背后的理性。
      • @new_perl - 也许吧。理由可能是您显然不能按值传递函数(sizeof(void (void)) 应该是什么?)但它是一个有效的类型和有效的声明,那么为什么不使用它呢?我个人更喜欢看到pass(func)pass(&func)
      猜你喜欢
      • 1970-01-01
      • 2019-07-17
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2012-09-16
      • 1970-01-01
      • 2019-05-01
      • 2011-03-30
      相关资源
      最近更新 更多