4

Метод подписи ...Как получить доступ к va_list в следующем блоке

- (void)blahBlahBlah:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2) { 

    va_list args; va_start(args,format); 

    void(^SOME_BLOCK)(void) = ^{ [Heathens prayToJesusWith: 
          [NSString.alloc initWithFormat:kFMT  
               arguments:args]; }; ... 
    va_end(args); 
} 

Однако Xcode скулит о args внутри SOME_BLOCK ... Cannot refer to declaration with an array type inside block. Почему нет? Это «по охвату», нет? Пробовал __block va_list безрезультатно. Совет? Обоснования?

ответ

5

va_list - непрозрачный тип, зависящий от реализации и зависящий от платформы. Возможно, что ваша конкретная система реализована как некоторый массив. Блоки не могут захватывать переменные типа массива. Стандарт C накладывает определенные ограничения на использование va_list, но нет никаких явных упоминаний о любых проблемах с блоками.

Если вы уверены, что блок будет работать в течение всего срока службы этой функции (которые он должен в противном случае в любом случае, потому что args имеет смысл только между va_start и va_end), то одно решение создать еще одну переменную, которая va_list *, установите до &args, а затем захватите его и разыщите, когда вам нужно его использовать.

+0

Это было лучшее решение, которое я мог найти. Все остальные вопросы полны ответов без решения. связывая это. –

Смежные вопросы