【问题标题】:Is it possible to affect local variables from a callback function in C++? [closed]是否可以从 C++ 中的回调函数影响局部变量? [关闭]
【发布时间】:2019-01-24 23:21:19
【问题描述】:

我正在为我正在开发的应用程序修改 SQLite。据我所知,描述如何从 SQLite DB 中获取信息的最清晰的文档与使用带有回调的 sqlite3_exec() 有关。

我打算在我的程序中有很多不同类型的查询,以及对结果的不同用途,如果我走那条路,似乎我将不得不为每个查询编写回调。我更愿意做的是准备一个具有必要大小和类型的局部变量来接收查询结果,调用查询并将结果汇​​集到局部变量中。

在我看来,我有三个选择:

  1. 通过引用将我的变量传递到回调中
  2. 让回调以某种方式直接访问我的局部变量
  3. 花更多时间学习 SQLite

所以,这是我想从你们那里知道的:

选项 1 和 2 是否可行?如果没有,是否有任何非常好的一般案例示例来说明如何在没有 sqlite3_exec 和回调的情况下查询 SQLite?

【问题讨论】:

  • @boxcartenant:您说得对,文档涵盖了它。所以你的问题的答案是“是的”,它不需要任何问题。但看起来你对 C 风格的回调不熟悉,所以请注意,调用者提供了一个参数。
  • 投票关闭,因为范围太广。但实际上,这是为了询问文档涵盖的内容,同时声称不需要帮助。
  • stackoverflow 上的人在所有问题中都喜欢代码,即使代码不起作用或没有意义。你会习惯的。在没有看到任何代码的情况下,我自己在理解“局部变量”的含义时遇到了一些麻烦,因为我自然希望将回调包装在某个类中并更改某些类成员(这也可以通过 void 来实现* 参数是类的一个实例。)
  • 我认为大多数人只是使用准备好的语句和sqlite3_step() 来获取查询结果,而不是使用sqlite3_exec() 回调。该功能主要用于您不关心结果的事情,例如创建表格。

标签: c++ sqlite callback


【解决方案1】:

所有接受回调的正确设计的 C 语言 API 都允许您将 void*(或类似)参数传递给 API,然后在调用时将其转发给您的回调。您可以使用此参数来传递局部变量的地址。例如:

extern "C" int my_callback(void* dest /*, other args */) {
    auto* result = static_cast<MyResultType*>(dest);
    // modify *result appropriately
}

MyResultType result1;
sqlite3_exec(/* other args, */ query1, my_callback, &result1 /*, other args */);
// result of query1 is in result1
MyResultType result2;
sqlite3_exec(/* other args, */ query2, my_callback, &result2 /*, other args */);
// result of query2 is in result2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多