将参数传递给 void(*)(void*)

Passing an argument to a void(*)(void*)

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

我正在用C++包装一些sqlite3 C代码,并且对这种类型的参数void(*)(void*)此函数感到困惑

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

所以我的包装纸看起来像

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_STATICSQLITE_TRANSIENT定义

不出所料,这两个定义被定义为

typedef void (*sqlite_3_destructor_type)(void*);

但我真的不明白 void/void 语法。我怎样才能把它包装在我的C++方法中,以接受像delete或定义这样的函数?

类型

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

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

void memory_management(void *);

然后它符合此定义,Query::Blob应定义为:

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);
}
这意味着

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

事实上,free就是这样的功能。您也可以使用类似删除的内容:

void myfree(void* data)
{
    delete static_cast<MyObject*>(data);
}

你失去了类型安全,但如果这是为了释放作为void*传递到其他地方并在回调中使用的对象,这是定义的行为。