默认参数和函数指针作为函数参数C ++

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了默认参数和函数指针作为函数参数C ++相关的知识,希望对你有一定的参考价值。

我有一个接受参数,默认参数,最后是指向另一个函数的指针和空指针的函数。

作为示例,请考虑以下内容

int foo(double arg 1, bool arg 2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*), void* data=0);

它在我的代码库中的多个地方都被调用。我注意到,当函数指针本身具有参数,然后是默认参数时,即使我想要的值是默认值,也必须指定默认参数。例如,以下代码将编译

foo(arg1, arg2, pbar);

但是下面的代码段不会

foo(arg1, arg2, pbar, (void*) myint);

作为更完整的示例,这是一个有效的代码段。

#include <iostream>

using namespace std;

int foo(double arg1, bool arg2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*)=0, void* data=0)
{
    return 1;
}


bool bar(bool bt, void* vs)
{
    return false;
}

int main()
{
    double arg1 = 0.0;
    bool arg2 = false;
    bool bt = true;
    int i = 1;
    void* vs = &i;
    bool pbar = bar(bt, vs);

    // no defaults specified and no function pointer arguments
    foo(arg1, arg2, pbar);

    // specify one of the defaults
    int arg3 = 23;
    foo(arg1, arg2, arg3, pbar);

    // don't specify the defaults, but give arguments to function pointer
    //foo(arg1, arg2, pbar, bt, vs);


    return 0;
}

最终评论通话将无法编译。

所以我的问题是,为什么在指定函数指针参数时,它不能编译?

我已经通过使用'命名参数'方法找到了解决问题的方法。因此,我创建一个类并使用引用实例化成员。但是,我有兴趣对上述失败的原因进行深入的解释。

下面显示错误

main.cpp: In function ‘int main()’:
main.cpp:41:33: error: invalid conversion from ‘void*’ to ‘bool (*)(bool, void*)’ [-fpermissive]
     foo(arg1, arg2, pbar, bt, vs);
                                 ^
main.cpp:13:5: note:   initializing argument 5 of ‘int foo(double, bool, int, int, bool (*)(bool, void*), void*)’
 int foo(double arg1, bool arg2, int arg3=0, int arg4=2, bool (*pbar)(bool,void*)=0, void* data=0)
     ^~~

我相信这是因为参数顺序混乱了。但是,为什么我可以插入函数指针,而不用担心默认的arg3和arg4?

答案
int foo(double arg1, bool arg2, int arg3 = 0, int arg4 = 2, bool * pbar(bool , void *) = 0, void * data = 0);

编译器仅关心参数的顺序

您不能跳过对arg3和arg4的定义,因为它们具有默认值。

通过这样做:

foo(arg1, arg2, pbar);

您基本上传递了“ pbar”(它是一个函数),其中“ arg3”应该是(它是一个整数)]

以上是关于默认参数和函数指针作为函数参数C ++的主要内容,如果未能解决你的问题,请参考以下文章

C语言-指针作为函数形参类型

C 语言结构体 ( 结构体作为函数参数 | 结构体指针作为函数参数 )

C 语言指针间接赋值 ( 指针作为 函数参数 的意义 | 间接赋值 代码示例 )

指针作为 C 中的函数参数

C++核心编程中的函数-占位参数和默认参数

C/C++可变参数模版和函数指针的结合