这个Objective-C(或c)语法有什么作用?

时间:2011-12-23 17:40:44

标签: objective-c

我在一些示例代码中遇到了这个问题:

- (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:”有什么作用?这个语法叫什么?我在哪里可以获得更多信息?

3 个答案:

答案 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方法的来源。