【问题标题】:Functions as function argument函数作为函数参数
【发布时间】:2020-09-01 06:59:08
【问题描述】:

我希望我的格式等没问题,因为这是我第一次发布问题。无论如何,我正在搜索并且找不到解释为什么这两个不同的函数定义/声明彼此等价:

#include <iostream> 

using namespace std;

int quadrat( int x )
{
    return x*x;
}

void printTable_1( int start, int end, int step, int (*func)( int x ) )
{
    for ( int i = start; i <= end; i+=step )
    {
        cout << i << "\t" << func(i) << '\n';
    }
}

void printTable_2( int start, int end, int step, int func( int x ) )
{
    for ( int i = start; i <= end; i+=step )
    {
        cout << i << "\t" << func(i) << '\n';
    }
}
    
int main()
{
    printTable_1(1,10,1,quadrat);
    printTable_2(1,10,1,quadrat);

    return 0;
}

我不明白的是,我没有在函数“printTable_2”中明确定义一个函数指针,就像函数“printTable_1”一样,它仍然需要一个。提前感谢您的回答!

【问题讨论】:

  • int func(int) 作为参数与声明“数组”参数(例如int a[])非常相似,因为编译器将其视为指针。
  • 如果您查看汇编代码,您会发现两者都转换为函数 ptr godbold
  • *.com/a/9413/13071379 可能是这个回答者可以为你解决问题
  • @UmarFarooq 您链接中的答案似乎不太相关,但this 对同一问题的回答确实如此。
  • @yaodav,不错的网站!快速查看汇编代码非常酷。

标签: c++ callback function-pointers


【解决方案1】:

这两个定义对编译器都是一样的。有关此行为的粗略概述,请参阅从第 20 页或 PDF 第 26 页开始的书 Effective STL

现在让我们看看另外三个函数声明。第一个 声明一个函数 g 接受一个参数,该参数是一个指向 a 的指针 函数什么都不接受并返回一个双精度:

int g(double (*pf)());

这是同一件事的另一种说法。唯一的区别是 pf 是使用非指针语法声明的(一种在两者中都有效的语法 C 和 C++):

int g(double pf()); // same as above; pf is> implicitly a pointer 

像往常一样,参数名称可以省略,所以 这是 g 的第三个声明,名称为 pf 淘汰:

int g(double ()); // same as above; parameter name is omitted

所以在你的例子中我们有

int (*func)( int x )

int func( int x )

正如您所看到的,它与示例中的方式相同,我们可以省略 func* 周围的括号。到最后还是和编译器一模一样。

【讨论】:

  • 感谢您的回答。通过测试,我已经意识到这两种变体都有效。然后我开始搜索验证以在标准中找到关于它的声明,但找不到任何我发布问题的原因。