我找到了这些工作类型的代码:
hash_init.key = &hash_key_lc;
和
ls->handler = init_connection;
此处hash_key_lc
和init_connection
都是函数,但其中一个是&
而另一个不是,为什么?
更新
所以他们是一回事,但理性是什么?
答案 0 :(得分:2)
这与以下问题相同: 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。“
答案 1 :(得分:1)
reference/deference
上的{p> function
被视为c
中的语言特殊情况,因为function
值得这种特殊情况,它不能通过某些value
,您只能通过address/reference
传递。
答案 2 :(得分:1)
见C99第6.3.2.1节,§4:
函数指示符是一个 具有函数类型的表达式。 除非是操作数
sizeof
运算符或一元&
运算符,函数指示符 类型''函数返回类型''是 转换为具有的表达式 键入''返回函数的指针 型””。
因此,如果foo
是一个函数,则表达式foo
和&foo
几乎可以互换,特别是
foo == &foo
这类似于将具有数组类型的表达式隐式转换为具有指针类型的表达式。此外,如果fp
是一个函数指针,您可以使用或不使用解除引用来调用它,即表达式
(*fp)(42)
和
fp(42)
是等价的。函数调用实际上是根据函数指针(第6.5.2.2节§1)定义的,而不是函数指示符,即就语言语义而言,第一个示例中的*fp
将隐式转换回fp
在应用parens之前。