4

我试图让我的宏像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)
4

1 回答 1

8

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

此外,-[NSString initWithFormat:arguments:]期望一个va_list参数,而__VA_ARGS__被所有传递的参数替换。在这里,您需要使用-[NSString initWithFormat:]or +[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)
于 2012-08-03T08:12:14.257 回答