首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将一个参数传递给一个void(*)(void*)

问将一个参数传递给一个void(*)(void*)
EN

Stack Overflow用户
提问于 2019-01-03 14:55:22
回答 2查看 87关注 0票数 3

我正在用C++包装一些C++C代码,并对这个函数中的这种参数void(*)(void*)感到困惑。

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

所以我的包装看起来

代码语言:javascript
复制
int Query::Blob(int index, const void* blob, int blob_size, void* memory_management){
   return sqlite3_bind_blob(stmt, index, blobl, blob_size, memory_management);
}

我应该能够将以下内容传递给最后一个参数

  1. 释放blob内存的一些函数
  2. SQLITE_STATIC或SQLITE_TRANSIENT定义

这两个定义不出所料地定义为

typedef void (*sqlite_3_destructor_type)(void*);

但我真的不明白void/void的语法。如何将其包装在C++方法中以接受像delete或定义这样的函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-01-03 14:59:23

类型void(*)(void*)是指向非成员函数的指针,该函数接受void *类型的单个参数并返回void。

因此,如果您的memory_management函数声明为:

代码语言:javascript
复制
void memory_management(void *);

然后它与这个定义相匹配,Query::Blob应该定义为:

代码语言:javascript
复制
int Query::Blob(int index, const void* blob, int blob_size, void (*memory_management)(void *)){
   return sqlite3_bind_blob(stmt, index, blobl, blob_size, memory_management);
}
票数 5
EN

Stack Overflow用户

发布于 2019-01-03 15:00:30

这意味着您需要提供一个回调,该调用接受一个参数,一个指向void的指针,而不返回任何内容。这必须是一个自由函数(不是一个类的非静态方法)。

事实上,free就是这样一个函数。您也可以使用类似删除的:

代码语言:javascript
复制
void myfree(void* data)
{
    delete static_cast<MyObject*>(data);
}

您失去了类型安全性,但是如果这是为了释放作为void*传递给其他地方并也用于回调的对象,则这是定义的行为。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54024727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档