如何在后续块中访问va_list

时间:2013-10-05 17:20:10

标签: syntax scope objective-c-blocks variadic-functions variadic

方法签名是......

- (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无济于事。建议吗?理由?

1 个答案:

答案 0 :(得分:6)

va_list是一种opaque类型,它依赖于实现和平台。可能是在您的特定系统上实现为某种数组。块无法捕获数组类型的变量。 C标准对va_list的使用施加了某些限制,但没有明确提及块的任何问题。

如果您确定该块将在此函数的生命周期内运行(无论如何它都必须运行;因为args仅在va_startva_end之间有意义),解决方案是创建另一个va_list *变量,设置为&args,然后在需要使用它时捕获它并取消引用它。