__VA_ARGS__宏扩展

时间:2012-08-03 07:54:22

标签: objective-c macros variadic-functions

我正在尝试让我的宏像NSLog()那样接受变量参数。下面的代码会导致解析问题。

定义此方法的正确方法是什么?

#define TF_CHECKPOINT(f, ...) \
do { \
NSString *s = [[NSString alloc] initWithFormat:f arguments:__VA_ARGS__] autorelease]; \
[TestFlight passCheckpoint:[NSString stringWithFormat:@"%@: %@", [self class], s]]; \
} while (0)

1 个答案:

答案 0 :(得分:7)

您忘记了autorelease消息的左括号。

此外-[NSString initWithFormat:arguments:]期望va_list参数,而__VA_ARGS__由所有传递的参数替换。在这里,您需要使用-[NSString initWithFormat:]+[NSString stringWithFormat:]

最后,您可以在__VA_ARGS__前加##。通过这样做,在没有参数时删除前面的逗号。

试试这个:

#define TF_CHECKPOINT(f, ...) \
do { \
NSString *s = [NSString stringWithFormat:(f), ##__VA_ARGS__]; \
[TestFlight passCheckpoint:[NSString stringWithFormat:@"%@: %@", [self class], s]]; \
} while (0)