2

我已经看到了有关包装 NSLog 的示例,但我不能 100% 确定细节。

例如#define debugLog(fmt,...) NSLog(@"%@",[NSString stringWithFormat:(fmt), ##__VA_ARGS__]);

这里的论点究竟是什么?

如果我想在日志中添加一个常量字符串,例如

- (void) logMessage:(NSString *) message ofType:(NSString *) type
{

    NSLog(@"%@ - %@", type, message);
}

我将如何在#define 宏中创建它?

4

1 回答 1

4

debugLog是一个可变参数宏(一个接受可变数量参数的宏)。特定的宏调用NSLog带有 2 个参数,第一个是格式字符串 ( @"%@"),第二个是返回的自动释放字符串,stringWithFormat它采用传递的格式字符串加上宏的可变参数。

__VA_ARGS__是在宏中引用变量参数列表的方法。它对应...于参数列表中的 。

代替您的logMessage方法,您可以使用debugLog宏来实现相同的结果:

debugLog("%@ - %@", type, message);

不过,宏本身似乎有点毫无意义,因为它只是包装NSLog而不添加任何其他内容。

如果您想要一个直接对应于 的宏logMessage,那么您根本不必处理可变参数列表:

#define logMessageAsMacro(message, type) NSLog(@"%@ - %@", message, type)

您必须小心两个参数是否都是NSString',因为宏是类型不安全的。

于 2012-10-05T15:13:52.163 回答