gpt4 book ai didi

objective-c - 获取指向类方法的指针,以便它可以作为回调传递给 C 函数

转载 作者:行者123 更新时间:2023-12-02 05:43:15 25 4
gpt4 key购买 nike

我正在使用 libssh2 并在我的 SSHWrapper 对象外定义了一个回调函数:

static void kbd_callback(const char *name, int name_len, const char *instruction, int instruction_len, int num_prompts, const LIBSSH2_USERAUTH_KBDINT_PROMPT *prompts, LIBSSH2_USERAUTH_KBDINT_RESPONSE *responses, void **abstract);

在我的 SSHWrapper 对象中,我执行以下操作,在验证 session 时传递回调函数:

/* Create a session instance */
LIBSSH2_SESSION *session = libssh2_session_init_ex(NULL, NULL, NULL, self);
while ((rc = libssh2_userauth_keyboard_interactive(session, userChar, &kbd_callback)) == LIBSSH2_ERROR_EAGAIN);

我想知道的是,是否可以将 kbd_callback() 函数移动到我的对象中,使其成为一个类方法:+(void) kbd_callback:...

如果是这样,我如何获取该函数的地址以便将其传递给 C 函数 libssh2_userauth_keyboard_interactive()

最佳答案

您现在采用的方法是合理的。也就是说,Objective-C 方法实际上只是 C 函数。使您建议的方法复杂化的主要因素是它们包含两个“隐藏”参数,self_cmdself 是调用方法的对象的实例,_cmd 是方法的选择器。您无法更改这些,它们的存在将使您的函数的参数无法与回调函数所需的参数相匹配。

以防万一您仍然感兴趣,您可以获得一个指向 Objective-C 方法的函数指针,如下所示:

IMP methodIMP = [self methodForSelector:@selector(someMethodThatTakesOneStringArgument:)];
void (*functionPointer)(id, SEL, NSString*) = (void (*)(id, SEL, NSString*))methodIMP;

// Then call it:
functionPointer(instance, @selector(someMethodThatTakesOneStringArgument:), aString);

编辑:我在这里发布了一个简单、完整的程序来演示这段代码:https://gist.github.com/2731937

关于objective-c - 获取指向类方法的指针,以便它可以作为回调传递给 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10667587/

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