我正在尝试让我的宏像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)
答案 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)