返回void*的C++/C函数指针

C++/C function pointers that return void*

本文关键字:函数 指针 C++ void 返回      更新时间:2023-10-16

我试图调用一个带有参数void(*)(void*, int, const char*)的函数,但我不知道如何将这些参数传递给该函数。

示例:

void ptr(int);
int function(int, int, void(*)(int));

我正试图调用这样的函数:

function(20, 20, ptr(20));

这可能吗?

您做了一件错误的事情——您试图在调用"function"之前调用"ptr"函数。您应该做的是只传递一个指向"ptr"的指针,并使用从"function"传递的指针调用"ptr",如下所示:

void ptr(int x)
{
    printf("from ptr [%d]n", x);
}
int function(int a, int b , void (*func)(int) )
{
    printf( "from function a=[%d] b=[%d]n", a, b );
    func(a); // you must invoke function here
    return 123;
}

void main()
{
    function( 10, 2, &ptr );
    // or
    function( 20, 2, ptr );
}

它给出:

from function a=[10] b=[2]
from ptr [10]
from function a=[20] b=[2]
from ptr [20]

这就是你想要的

对于

function(20, 20, ptr(20));

要想工作,你必须拥有这样的东西

// 'ptr' must return sth (int for example)
// if you want its ret val to be passed as arg to 'function'
// this way you do not have to invoke 'ptr' from within 'function'
int ptr(int);
int function(int, int , int);

通常的技巧是使用typedef进行签名:

 typedef void signature_t (void*, int, const char*);

请注意,如果没有typedef,语法就像一个函数声明。它将signature_t声明为函数的typedef,因此在实践中您将始终使用指向signature_t的指针

然后您可以将您的"高阶"函数声明为

 int function (int, int, signature_t*);

另见本答复。

函数调用的正确语法是:

function(20,20, &ptr);

如果你觉得迷路了,试试一些教程,或者这个

除非我完全误解了您的代码,否则您正试图通过传递带有参数的函数指针

function(20, 20, ptr(20));

这是不正确和非法的。为了将一个函数作为参数传递给另一个函数,您必须遵循以下语法

function(20, 20, &ptr); 
or
function(20, 20, ptr); 

尽管我会重新建议离开为了可读性,

不能将ptr(20)传递给此函数,因为只能将指针传递给函数,而不能将指针与参数一起传递。你可以阅读有关函子的文章,theu将帮助你解决这个问题。或者另一种解决方案是将签名更改为

int function(int, int, void(*)(void) );

和写功能

void ptr_wrap(void) {ptr(20);}

所以您可以调用function(20, 20, ptr_wrap);。但函子可以用更优雅的方式解决这个问题。

ptr(20)ptr的返回值,当您将20传递给它时。如果您想传递函数(而不是它的返回值),您应该只编写function(20,20,ptr);