我在一些示例代码中遇到了这个问题:
- (IBAction) startPlayLowNote:(id)sender {
UInt32 noteNum = kLowNote;
UInt32 onVelocity = 127;
UInt32 noteCommand = kMIDIMessage_NoteOn << 4 | 0;
OSStatus result = noErr;
require_noerr (result = MusicDeviceMIDIEvent (self.samplerUnit, noteCommand, noteNum, onVelocity, 0), logTheError);
logTheError:
if (result != noErr) NSLog (@"Unable to start playing the low note. Error code: %d '%.4s'\n", (int) result, (const char *)&result);
}
“logTheError:”有什么作用?这个语法叫什么?我在哪里可以获得更多信息?
答案 0 :(得分:6)
logtheError:
是一个标签。 require_noerr
宏中有一个goto
,如果出现错误,它将跳转到指定的标签。这是一个简化和扩展的转到/标签示例,没有任何有趣的业务或宏:
int call2Functions(void)
{
int err = function();
if (err)
goto errorExit;
err = function2();
errorExit:
return err;
}
最初是C语法。您可以在C标准的 6.8.1标记语句部分了解更多信息。
答案 1 :(得分:1)
它是一个标签。编程实践阻止了它们在上个世纪或两个世纪的使用;-)但偶尔它们是有用的。
在此代码示例中,require_noerr
是一个带有两个参数的宏,它测试第一个参数,如果不是noErr
则跳转(goto
)到第二个参数 - 必须是一个标签。
示例代码有点复杂,相当于:
OSStatus result = MusicDeviceMIDIEvent (self.samplerUnit, noteCommand, noteNum, onVelocity, 0);
if (result != noErr)
NSLog (@"Unable to start playing the low note. Error code: %d '%.4s'\n", (int) result, (const char *)&result);
答案 2 :(得分:0)
它看起来像是我的标签。看看上面一行中require_noerr方法的来源。