是否';void(*)(int)和#x27;与'相同;无效(^)(int)和#x27;? 今天,我正在研究一个从C++到Objto-C方法的回调通道。 最后,我解决了这个问题,但有几个代码让我困惑。 在Objective-c中,普通人使用块实现回调,块声明如下所示:
returnType(^blockName)(参数类型)是否';void(*)(int)和#x27;与'相同;无效(^)(int)和#x27;? 今天,我正在研究一个从C++到Objto-C方法的回调通道。 最后,我解决了这个问题,但有几个代码让我困惑。 在Objective-c中,普通人使用块实现回调,块声明如下所示:,c++,objective-c,C++,Objective C,returnType(^blockName)(参数类型) 我还了解了C++回调,一个定义了相同类型的回调: returnType(*funcName)(参数类型) 当我通过C++回调到ObjtoE-C时,编译器警告我: "Cannot initialize a parameter of type 'void (^)(int)' with an rvalue of type 'void (*)(int)" 无法使用'void(*)(int)类型的右值初始化'void(^)(int)'类型的参数 最
我还了解了C++回调,一个定义了相同类型的回调:
returnType(*funcName)(参数类型)当我通过C++回调到ObjtoE-C时,编译器警告我:
"Cannot initialize a parameter of type 'void (^)(int)' with an rvalue of type 'void (*)(int)" 无法使用'void(*)(int)类型的右值初始化'void(^)(int)'类型的参数 最后,我将^
更改为*
,它可以工作。我想知道,在定义上,^
和*
之间的区别是,它们有相同的行为吗?这是一个块:
returnType (^blockName)(parameterTypes)
这是一个函数指针:
returnType (*funcName)(parameterTypes)
不兼容。
< P>标准C和C++没有可调用块。然而,显然,这些语言的一些编译器确实将该功能作为扩展实现。我看到的一些文档表明它也是苹果对Objective C的扩展,但由于Objective C在苹果世界之外很少使用,这可能是一个没有区别的区别 在任何语言中,如果将回调实现为函数,那么必须通过函数指针将该回调呈现给预期的调用方,并且调用方必须准备好以该形式接受它。另一方面,如果将回调实现为块,则必须通过块指针将其呈现给调用方,并且调用方必须准备好接受该表单。这两者是不可互换的,它们有不同的语法,您已经介绍过了。然而,通过单独的参数或完全单独的注册函数,可以设计一种同时接受两种形式的机制。目标C块(^
)与函数指针(*
)不兼容。与函数指针相比,它们的优点是能够从周围的上下文中捕获值和变量(它们是闭包) 编写从块调用函数指针的包装器非常简单:
typedef int (*funptr)(int);
typedef int (^funblock)(int);
int use_block_callback(int y, funblock fb)
{
return fb(y);
}
int use_funptr_callback(int y, funptr f)
{
return use_block_callback(y, ^ int (int x) { return f(x); });
}
int add_one(int x) { return x + 1; }
int foo(int x)
{
return use_funptr_callback(23, add_one);
}
// Or
int (*some_pointer)(int) = add_one;
int (^some_block)(int) = ^ int (int x) { return some_pointer(x); }
< C++ >代码> ^ < /代码>是按位的XOR@DimChtz就像在Objective-C中一样。上下文会产生差异。我想知道的是运行时的差异behavior@DelphiQin你没有问这个问题,但是网上有很多关于这两个概念的文档。谢谢你的回答,它帮助了我。:)谢谢你的回答,它帮助了我。:)