gpt4 book ai didi

c++ - 如何将函数从 C++ 类传递给 C API?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:26 26 4
gpt4 key购买 nike

如何将动态生成的 C++ 函数作为 *funcprt 传递给 C API?

API 导出这个:

DllImport void api_register_func(char *func_name, void (*funcptr)(char *, char *));

我必须在运行时创建函数,因为我之前不知道它。所以我用了一个类:

class JsFunc
{
public:
char * JsFuncName;
char * JsParameter;

void RunFunc(char * val1, char * val2)
{
printf("\nJsFunc.runFunc executed, JsParameter=%s passed\n",JsParameter);
}
};

然后这样调用它:

JsFunc * jsm = new JsFunc ();
jsm->JsFuncName = external_parameter1;
jsm->JsParameter = external_parameter2;
api_register_func(external_parameter1, jsm->RunFunc);

但是 VisualStudio 2015 告诉我:

Error C3867 'JsFunc::runFunc': non-standard syntax; use '&' to create a pointer to member VJCS C:\Users\astrauss\Source\Repos\VCJS\VCJS\VCJS.cpp 54

如果代码不好,我很抱歉,我不是 C/C++ 程序员,但需要让它在我的日常工作中运行。谢谢!

最佳答案

不幸的是,您在这里没有太多选择。 API:

DllImport void api_register_func(char *func_name, 
void (*funcptr)(char *, char *));

只允许你提供一个函数指针,没有任何上下文。所以你可以传入一个自由函数或者静态成员函数,但是你没有办法提供一个成员函数。如果你有上下文:

DllImport void better_api_register_func(char *func_name, 
void *context,
void (*funcptr)(void *, char *, char *));

然后你可以写一个简单的 lambda:

api_register_func(external_parameter1,
jsm, //context
[](void *ctxt, char* arg1, char* arg2) {
static_cast<JsFunc*>(ctxt)->runFunc(arg1, arg2);
});

并且您有效地使用成员函数作为回调。但是,这不是一种选择。相反,您只能使用全局变量:

std::unique_ptr<JsFunc> the_global_func;

您可以在运行时分配:

the_global_func.reset(new JsFunc);
// set stuff

然后在 lambda 中使用全局变量。由于它是全局的,我们不需要(事实上,不能)捕获它——这意味着我们的 lambda 可以转换为函数指针:

api_register_func(external_paramter1,
[](char* arg1, char* arg2) {
the_global_func->runFunc(arg1, arg2);
});

关于c++ - 如何将函数从 C++ 类传递给 C API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31818350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com