如何在后续块中访问va_list

Ale*_*ray 4 syntax scope variadic variadic-functions objective-c-blocks

方法签名是......

- (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);
}
Run Code Online (Sandbox Code Playgroud)

然而,Xcode argsSOME_BLOCK... 内部发牢骚Cannot refer to declaration with an array type inside block.为什么不?这是"范围内",不是吗?试图__block va_list无济于事.建议吗?理由?

new*_*cct 6

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

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