【问题标题】:C ­function declaration in a parameter list参数列表中的 C 函数声明
【发布时间】:2015-04-06 11:35:09
【问题描述】:

我在 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++ 中是否允许?

【问题讨论】:

    标签: c++ c function


    【解决方案1】:

    没有区别。这只是语法糖。它在 C 和 C++ 中都是允许的。

    函数参数被编译器简单地重写为函数指针参数,就像数组参数被编译器重写为指针参数一样。

    作为参考,这里是 C 标准第 3.7.1 节的摘录:

    g(int (*funcp)(void))
    
    // ...
    
    or, equivalently, 
    
    g(int func(void))
    

    【讨论】:

    • 只是问先生,v->f = f; 是否允许?我的意思是函数返回类型不同,对吧?
    • 对不起,我的错误。已编辑。
    • 不确定你的意思。两个函数都返回void
    • @fredoverflow 不是在编辑之前,而是在发表评论时。
    • 编译器到函数指针的转换不会由 typedef 发生,对吗?所以using f = void(int) 不等于using f = void(*)(int)
    【解决方案2】:

    据我所知do_some 采用函数而不是函数指针。

    不,作为函数参数,函数类型被调整为相应的函数指针类型。参数f 与成员f 具有相同的函数指针类型。

    但实际上与 void do_some( void (*f)(const void *x) ) 有什么区别?

    什么都没有。

    我应该什么时候使用它?

    如果你喜欢额外的冗长。或者在其他上下文中,例如声明,您需要区分函数和指针类型。

    这在 C++ 中是否允许?

    对于函数参数(以及非类型模板参数),在 C++ 中应用相同的调整。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 2010-12-07
      • 2020-03-08
      • 1970-01-01
      • 2017-03-25
      • 2019-01-15
      • 1970-01-01
      相关资源
      最近更新 更多