我在C代码中发现有点令人困惑的事情
struct SomeStruct {
// ...
void (*f)(const void *x);
};
void do_some( void f(const void *x) ) { // what?
struct SomeStruct* v;
// ...
v->f = f;
}
我可以理解do_some
取代函数而不是函数指针。
但是在实践中与void do_some( void (*f)(const void *x) )
的区别是什么?什么时候应该用这个?在C ++中允许这样做吗?
答案 0 :(得分:7)
没有区别。这只是语法糖。它在C和C ++中都是允许的。
函数参数只是由编译器重写为函数指针参数,就像数组参数被编译器重写为指针参数一样。
供参考,以下是C标准的摘录,第3.7.1节:
g(int (*funcp)(void))
// ...
or, equivalently,
g(int func(void))
答案 1 :(得分:4)
我可以理解
do_some
取函数代替函数指针。
不,作为函数参数,函数类型被调整为相应的函数指针类型。参数f
与成员f
具有相同的函数指针类型。
但是在实践中与void
do_some( void (*f)(const void *x) )
的区别是什么?
无论如何。
什么时候应该使用它?
如果你喜欢额外的冗长。或者在其他上下文中,例如声明,您需要区分函数和指针类型。
这是否允许在C ++中使用?
对于函数参数(以及非类型模板参数),在C ++中应用相同的调整。