Что делает этот синтаксис Objective-C (или, возможно, с)? - PullRequest
2 голосов
/ 23 декабря 2011

Я сталкивался с этим в некотором примере кода:

- (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 ]

6 голосов
/ 23 декабря 2011

logtheError: это метка.Макрос require_noerr содержит goto, который переходит на указанную метку в случае ошибки.Вот упрощенный и расширенный пример goto / label без каких-либо забавных бизнесов или макросов:

int call2Functions(void)
{
   int err = function();
   if (err)
     goto errorExit;

   err = function2();

 errorExit:
   return err;
 }

Первоначально это синтаксис языка C.Вы можете узнать больше в стандарте C, раздел 6.8.1 Помеченные операторы .

1 голос
/ 23 декабря 2011

Это этикетка. Практика программирования не поощряла их использование в течение прошлого или двух столетий ;-) Но иногда они полезны.

В этом примере кода require_noerr - это макрос, который принимает два аргумента, он проверяет первый и, если он не noErr, выполняет переход (goto) ко второму аргументу, который должен быть меткой. 1006 *

Пример кода немного запутан, он эквивалентен:

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);
0 голосов
/ 23 декабря 2011

Для меня это выглядит как ярлык.взгляните на источник для метода require_noerr в строке выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...