【问题标题】:C Ways To Pass Function As Argument To Function将函数作为参数传递给函数的 C 方法
【发布时间】:2013-09-07 04:52:55
【问题描述】:

我注意到似乎有不同的方法可以将函数作为参数传递给另一个函数。原型是:

void foo1(double f(double));

void foo2(double (*f)(double));

这两者有区别吗?它们是否以相同的方式实施?还有其他传递函数的方法吗?

【问题讨论】:

    标签: c function function-pointers


    【解决方案1】:

    第二个可以说是“正确”的写法。它说foo1() 的参数是一个指向函数的指针。第一个表示参数是一个函数,但您不能将函数作为函数本身传递,因此编译器将其视为指向函数的指针。因此,在实践中,它们是等价的——在这种情况下。但是,在其他情况下,您将无法使用 double f(double); 表示法来声明指向函数的指针。

    ISO/IEC 9899:2011 §6.7.6.3 函数声明符(包括原型)

    ¶8 将参数声明为“函数返回类型”应调整为“指向 函数返回 type",如 6.3.2.1.

    附属问答

    您能否举一个double f(double); 不起作用的例子?

    #include <math.h>
    
    double (*pointer)(double) = sin;
    double function(double);   // This declares the existence of 'function()'
    

    这是在文件范围内;它也可以在代码块中,例如在函数内部。指向函数符号的指针按您的意愿工作。普通函数只是声明一个函数,而不是包含指向函数的指针的变量。

    符号(大致)等价的唯一地方是函数参数列表中:

    声明:

    double integrate(double lo, double hi, double (*function)(double));
    double differentiate(double lo, double hi, double function(double));
    

    定义:

    double integrate(double lo, double hi, double (*function)(double))
    {
        ...
    }
    
    double differentiate(double lo, double hi, double function(double))
    {
        ...
    }
    

    函数或函数指针参数可以在这些声明和定义中互换使用,但只能在参数列表中使用,而不是在函数体中。

    因为显式的“函数指针”表示法在任何地方都有效,而其他表示法只能在非常有限的一组地方使用,因此您通常应该使用显式的“函数指针”表示法,即使它有点冗长。

    【讨论】:

    • 你能举一个double f(double); 不起作用的例子吗?
    • @user968243:只是一个简单的指针定义,double f(double) = my_double_func; 行不通,但double (*f)(double) = my_double_func; 可以。
    • 对于应该首选哪种语法是否有任何普遍共识?第一个看起来更易读,但有点误导,而第二个写起来更麻烦,但清楚地反映了正在发生的事情。
    • 使用指向函数(第二)表示法的指针。正如你所说,它是明确的并且在任何地方都可以正常工作,而第一个表示法只能在函数参数列表中使用。
    【解决方案2】:

    两种方法都声明了相同的参数类型。两者之间没有任何区别。函数类型的参数隐式调整为指向函数类型的指针,这意味着编译器将第一个声明解释为与第二个声明等效。您想在代码中使用哪一个是个人喜好问题。

    【讨论】:

      【解决方案3】:

      将函数作为参数传递给函数的语法

      typedef void (*functiontype)();
      

      声明一个函数

      void dosomething() { }
      
      functiontype func = &dosomething;
      func();
      

      这些库可以帮助将函数指针转换为可读的类型。 boost函数库很棒,值得努力!

      boost::function<int (char a)> functiontype2;
      

      例子:

      for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
        print(ctr);
      }
      
      void func ( void (*f)(int) ) {
        for ( int ctr = 0 ; ctr < 5 ; ctr++ ) {
          (*f)(ctr);
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-09-13
        • 1970-01-01
        • 2015-06-09
        • 2011-08-18
        • 2013-01-27
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        相关资源
        最近更新 更多