参数列表中的C函数声明

时间:2015-04-06 11:35:10

标签: c++ c function

我在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 ++中允许这样做吗?

2 个答案:

答案 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 ++中应用相同的调整。