将参数传递给函数指针

Passing parameters to function pointer

本文关键字:指针 函数 参数传递      更新时间:2023-10-16

我正在尝试将参数传递给作为参数传递的函数指针。

法典:

void Test(wchar_t* a, wchar_t* b)
{
    // ...
}
void Test2(void(*Func)(wchar_t*, wchar_t*))
{
    // ...
}
int main()
{
    Test2(Test(L"Hello", L"Testing"));
    return 0;
}

我收到此错误:

类型为"void

"的参数与类型为"void (*)(wchar_t *, wchar_t *)"的参数不兼容

如何解决此问题以完成我想要实现的目标?

编辑:抱歉不清楚。我实际上要完成的是将一个函数注入子进程并传递两个参数(wchar_t*、wchar_t*),以便我可以使用它们。但是主函数可以是 void 或 int argc,char** argv。所以我通过简单地使用全局变量完成了我想要实现的目标

你可能想要类似的东西

void Test2(void(*Func)(wchar_t*, wchar_t*),wchar_t* x, wchar_t* y)
{
    (*Func)(x,y);
}
int main()
{
    Test2(Test,L"Hello", L"Testing");
    return 0;
}

相反。


至于你的评论

如何在C++使用模板执行此操作?

我能想到的

template<typename Param>
void Test2(void(*Func)(Param, Param), Param x, Param y) {
    (*Func)(x,y);
}
void Test(wchar_t* a, wchar_t* b);
int main() {
    Test2(Test,L"Hello", L"Testing");
    return 0;
}

这应该可以正常工作。

有多种方法可以解决此问题,但是,让我尝试说明为什么会发生此错误。

每个函数都有与之关联的值类型。这意味着,每个函数的计算结果都是某种类型的值。这由其返回值指示。

例如:

int foo(/*whatever*/); 

计算结果为 int。因此,foo(/*whatever*/)可以在任何需要int的地方使用。例如像int a = b + foo(/*whatever*/).

Simlarly float bar(/*whatever*/);的计算结果为float,因此bar(/*whatever*/)可以在任何需要浮点数的地方使用。例如像float a = b + bar(/*whatever*/).

但是,返回voidvoid foobar(/*whatever*/)的函数的计算结果为 void并且不能在需要某种类型的值(例如 int、float 等)的情况下使用。

现在进入代码。main函数中的这一行存在以下问题:

int main()
{
    Test2(Test(L"Hello", L"Testing")); /* Issue here */
    return 0;
} 

在这里,您将Test(L"Hello", L"Testing")作为参数传递给Test2。现在请记住,Test(/*whatever*/) 的计算结果为 void,因为 Test返回一个 void。

所以你在这条线上所做的是这样的

Test2(/*something that evaluates to a void*/);

然而,Test2期待一个void (*)(wchar_t*, wchar_t*),这是一个pointer to a function that returns void,它与void不同。

因此,正在

发生的事情是,编译器看到您正在预期void (*) (wchar_t*, wchar_t*)的位置传递void,因此它正确地指示了该错误。

可以

有不同的方法可以解决此问题,这些方法在其他答案中提到。

我需要使用C++模板吗?

当然,您可以使用C++模板执行此操作,如下所示:

#include<utility>
// ...
template<typename F, typename... A>
void Test2(F &&f, A&&... a)
{
    std::forward<F>(f)(std::forward<A>(a)...);
    // ...
}
// ...
Test2(Test, L"Hello", L"Testing");

但是你不需要他们来做你想做的事情。
@πάνταῥεῖ已经在其回答中解释了原因。