Hi Fritz and Jens, It makes total sense now. Out of the two options (NULL sentinel vs a number to indicate the number of args), I would choose NULL because out of the two, it's more foolproof. Is there a consensus about which option is considered best practice?
Thanks again, -- Tito On Jul 4, 2012, at 4:43 PM, Fritz Anderson <fri...@manoverboard.org> wrote: > On 4 Jul 2012, at 6:30 PM, Tito Ciuro wrote: > >> void blockStep(fooBlock firstBlock, ...) >> { >> va_list args; >> va_start(args, firstBlock); >> id result = nil; >> >> do { >> result = firstBlock(result, nil); >> NSLog(@"%@", result); >> } while (nil != (firstBlock = va_arg(args, fooBlock))); >> >> va_end(args); >> } >> >> The output looks like this: >> >>> 2012-07-04 16:18:40.000 BlockStep[12418:303] One! >>> 2012-07-04 16:18:56.533 BlockStep[12418:303] One!, Two! >> >> I've eliminated the crash by adding a nil sentinel in blockStep(): >> >> blockStep ( >> ^ (id result, NSError **error) { >> NSMutableString *value = [NSMutableString new]; >> [value appendString:@"One!"]; >> return value; >> }, >> ^ (id result, NSError **error) { >> NSMutableString *value = [NSMutableString new]; >> if (nil != result) { >> [value appendString:result]; >> [value appendString:@", "]; >> } >> [value appendString:@"Two!"]; >> return value; >> }, >> nil >> ); > >> >> This allows it to work without crashing, but I'd like if possible to avoid >> having to place the sentinel. Any ideas? > > Not possible. > > Notionally, all parameters are passed to C functions in memory on a stack, > which is unformatted and could contain anything. A function has no way of > knowing how many parameters have been pushed onto the stack, or where the > memory trails off into saved processor state and the like, or the types, or > the amounts of memory they subtend…. > > Most variadic functions require sentinels (usually NULL) to tell them to stop > looking for parameters. The best-known exceptions are printf()-family > functions, which know what to find on the stack because the format string > tells them. > > — F > > -- > Fritz Anderson > Xcode 4 Unleashed: Don't bring your bathroom copy into the kitchen — were you > raised in a barn? > <http://x4u.manoverboard.org/> > > > _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com