我已经测试了以下代码:
#include <stdio.h>
void f(void g()) {
g();
}
void g(void) {
printf("hello, world\n");
}
int main() {
f(g);
return 0;
}
它运作良好。在上面的代码中,为什么在c中我们可以将函数名称g
作为参数,而将函数原型作为参数?
在《 K&R》一书中,它说我们可以使用函数指针:所以我可以这样定义函数f
:
void f(void (*g)()) {
g();
}
void g(void) {
printf("hello, world\n");
}
int main() {
void (*pf)() = g;
f(pf);
f(g); // Here f(g) also works.
return 0;
}
因此,在第一种f
定义形式中,参数原型为void g()
,在第二种形式中,参数原型为void (*g)()
。为什么的两种定义形式f
都相同?
而在第二种形式中,参数是指向函数的指针,为什么f(g)
还起作用?
来自C标准(6.3.2.1左值,数组和函数指示符)
4函数指定符是具有函数类型的表达式。除非它是sizeof运算符(65)或一元&运算符的操作数,否则将类型为“ function returning type”的函数指定符转换为类型为“ pointer to function returning type”的表达式。
和(6.7.6.3函数声明符(包括原型))
8将参数声明为“函数返回类型”声明调整为“指向函数返回类型的指针”,如6.3.2.1所述。
因此,这些函数声明
void f(void g());
和
void f(void ( *g )());
声明相同的一个函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句