gpt4 book ai didi

objective-c - 是否可以直接将函数指针作为 block 参数传递?

转载 作者:太空狗 更新时间:2023-10-30 03:41:57 25 4
gpt4 key购买 nike

假设我有一个函数需要一个 block :

void foo(Foo (^block)(Bar));

假设我有一个具有相同签名的函数,除了不是 block :

Foo myFunction(Bar);

我能做到:

foo(^(Bar bar) { return myFunction(bar); });

但我宁愿这样做,如果可行的话,这将是等效的:

foo(&myFunction);

如果我尝试这样做,XCode 会说:

No matching function for call to 'foo'

一个 block 是一个函数指针和一些上下文,所以在这个层面上,想要使用一个普通的函数指针作为一个具有空上下文的 block 似乎是合理的。可能吗?

最佳答案

A block is a function pointer together with some context, so on that level it seems reasonable to want to use a plain function pointer as a block with an empty context. Is it possible?

但是,问题在于 block 不是带有某些上下文的函数指针

block 在编译期间捕获可执行代码,在执行期间捕获状态。可执行代码在传递参数方面遵循 C ABI 但是,就像方法调用一样,它有一些非常具体的要求。将其转换为 C 函数声明,返回 BOOL 并采用单个 int 参数的 block 将如下所示:

BOOL blockLikeFunc(void *block, int arg) { ... }

也就是说, block “函数”的第一个参数必须是指向 block 本身的指针。

因此,不,您不能只是撕掉 block 的“函数”指针并将其转换为 C 函数或从 C 函数转换。

关于objective-c - 是否可以直接将函数指针作为 block 参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13233402/

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