Могу ли я изменить va_list перед его передачей?

В своих попытках понять, что я могу и чего не могу делать с va_list в (Objective-) C, я наткнулся на эту небольшую загадку. Я надеялся создать категорию на NSString , которая в некоторых случаях немного упростила бы сообщение stringWithFormat: , просто для удовольствия. Я стремился к тому, чтобы иметь возможность использовать такую ​​реализацию:

[@"My %@ format %@!" formattedWith:@"super", @"rocks"];

В надежде получить строку с надписью « Мой суперформат потрясающий! ». Моя (неправильная) реализация метода выглядит так:

- (NSString *)formattedWith:(NSString *)arguments, ...
{
    va_list list;
    va_start(list, arguments);
    NSString *formatted = [[[NSString alloc] initWithFormat:self arguments:list] autorelease];
    va_end(list);
    return formatted;
}

Теперь проблема в том, что как только вызывается va_start () , va_list «сокращается» (из-за отсутствия лучшего слова) и содержит только остальные аргументы (в случае примера остается только @ "rocks" , плюс вызывающий объект, который меня не волнует). То, что передается в сообщении initWithFormat: , поэтому дает неправильный результат.

К вопросу. Есть ли способы изменить va_list перед тем, как передать его в сообщение initWithFormat: , чтобы я мог каким-то образом вернуть первый аргумент обратно в список?

Я не ищу для итеративного процесса, когда я сам просматриваю va_list, я хочу понять ограничения va_list в целом.Спасибо!

6
задан epologee 3 October 2011 в 15:04
поделиться