Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否';void(*)(int)和#x27;与'相同;无效(^)(int)和#x27;? 今天,我正在研究一个从C++到Objto-C方法的回调通道。 最后,我解决了这个问题,但有几个代码让我困惑。 在Objective-c中,普通人使用块实现回调,块声明如下所示:_C++_Objective C - Fatal编程技术网

是否';void(*)(int)和#x27;与'相同;无效(^)(int)和#x27;? 今天,我正在研究一个从C++到Objto-C方法的回调通道。 最后,我解决了这个问题,但有几个代码让我困惑。 在Objective-c中,普通人使用块实现回调,块声明如下所示:

是否';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)'类型的参数 最

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)'类型的参数 最后,我将
^
更改为
*
,它可以工作。我想知道,在定义上,
^
*
之间的区别是,它们有相同的行为吗?

这是一个块:

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你没有问这个问题,但是网上有很多关于这两个概念的文档。谢谢你的回答,它帮助了我。:)谢谢你的回答,它帮助了我。:)