【发布时间】:2016-12-14 15:19:16
【问题描述】:
我正在使用C libstrophe library 在 C++11 中制作 xmpp 应用程序。我正在尝试为特定 ID 注册消息处理程序,因此我可以使用 xmpp_id_handler_add 识别特定的返回消息。
void xmpp_id_handler_add(xmpp_conn_t * const conn,
xmpp_handler handler,
const char * const id,
void * const userdata)
但是关于 strophe 的实现有一些我不明白的地方。
Strophe 将只接受形式的函数指针
typedef int (*xmpp_handler)(xmpp_conn_t * const conn,
xmpp_stanza_t * const stanza,
void * const userdata);
使用静态函数很容易做到这一点,但通过查看源代码我发现this
/* check if handler is already in the list */
item = (xmpp_handlist_t *)hash_get(conn->id_handlers, id);
while (item) {
if (item->handler == (void *)handler)
break;
item = item->next;
}
if (item) return;
这意味着如果我尝试使用相同的静态函数调用 xmpp_id_handler_add 两次,但 id 和 userdata 不同,它将拒绝第二次调用。
所以我想也许每次我想添加一个新的 ID 处理程序时我都可以制作一个 lambda,就像这样
auto msgHandler = [](xmpp_conn_t* const pConn,
xmpp_stanza_t* const pStanza,
void* const pUserdata) -> int
但是当我查看 lambda 的指针值时
printf("%p\n", (void*)((xmpp_handler)msgHandler));
然后运行了两次,两次都得到了相同的值。在这种情况下,lambda 似乎就像一个静态函数。
那么,每次我想监听一个新的 ID 时,我怎样才能创建一个新的、唯一的函数指针呢?或者,我是否误解了应该如何使用 libstrophe?您是否应该为每个要侦听的新 ID 设置一个新的静态函数?
【问题讨论】:
-
@Olaf 我很抱歉,我认为它们是相关的,因为 libstrophe 是用 C 编写的,问题的答案可能是我误解了如何使用 xmpp
-
据我了解,您询问有关使用 C++ 库的问题。它看起来不像是关于 C 语言本身的问题(分别是该语言的问题)。 xmpp 类似。 libaray-tag 在这里应该足够了。如果答案证明我错了,请随意添加标签(毕竟我并不完美,可能会像其他人一样犯错),但请不要提前添加。
-
@RichardHodges 我有很多 ID,这不是问题。问题是 strophe 不允许你使用相同的处理函数两次,即使你使用不同的 ID 和用户数据
-
@Sossisos hash_get(conn->id_handlers, id) 返回特定 id 的处理程序列表,因此它不应阻止您对不同的 id 使用相同的函数。
-
@AlexanderAnikin 具体的阻塞代码行是“if (item->handler == (void *)handler)”
标签: c++ lambda libstrophe