为什么我可以将C块分配给LLVM编译器/ Xcode中的不兼容typedef?

时间:2015-12-24 11:10:23

标签: objective-c c xcode llvm

我正在开发iOS应用程序,然后我意识到在将C块分配给具有不兼容签名的typedeffed块指针类型时,我发生了严重错误。

这是一个奇怪的部分:它没有给出任何错误或警告,编译和运行完美。

这是我的typedef:

typedef void (^ULAction)();

任何ULAction对象都应该是不带参数的C块,并且不返回任何值。我已经忘记了签名,并且在我的应用程序的某些时候,我错误地做了很多这样的任务:

ULAction preAction = ^(id result){
    //just some code that uses the variable 'result'
    [[NSNotificationCenter defaultCenter] ...];
};

C块的签名和类型不匹配,但代码运行完美。我没有收到任何警告或错误。变量result使用,有效,并且不会以任何方式崩溃。它只是有效。

我想知道为什么会这样。

1 个答案:

答案 0 :(得分:4)

空参数列表表示您可以传递任意数量的参数。

如果您将块定义为:

,我认为情况会有所不同
typedef void (^ULAction)(void);
//                       ^^^^