1

在我的 IOS 项目中,我有一个包含该函数的自定义 Logger 类(单例)

- (void)log:(NSString *)domain logLevel:(int)level logMessage:(NSString *)message

通过以下预处理器宏全局可用:

#define MyLog(domain, level, message) [[MyLogger sharedInstance] log:domain logLevel:level logMessage:message]

现在当我打电话时:

MyLog(@"common", LL_ERROR, @"There was an error!");

一切正常。但实际上,logMessage 有时会包含字符串占位符。所以最大的问题是:我怎样才能让我的宏接受这样的调用

MyLog(@"common", LL_ERROR, @"There was an error: %@", [error debugDescription]);

使用当前的解决方案,Xcode 抱怨:“为类似函数的宏调用提供了太多参数”。

4

1 回答 1

5

首先,您必须更改log方法以采用“变量参数列表”,例如:

- (void)log:(NSString *)domain logLevel:(int)level logMessage:(NSString *)message, ...
{
    va_list argList;
    va_start(argList, message);
    NSString *fullMessage = [[NSString alloc] initWithFormat:message arguments:argList];
    va_end(argList);

    NSLog(@"domain:%@, level:%d: %@", domain, level, fullMessage);
}

然后,您必须更改MyLog宏以使用可变数量的参数。这是一个 GNU 功能(http://gcc.gnu.org/onlinedocs/cpp/Variadic-Macros.html),它也适用于 Clang:

#define MyLog(domain, level, message, ...) \
   [[MyLogger sharedInstance] log:domain logLevel:level logMessage:message, ##__VA_ARGS__]

现在

MyLog(@"common", LL_ERROR, @"There was an error!");
MyLog(@"common", LL_ERROR, @"There was an error: %@", [error debugDescription]);

两者都应该可以正常工作。

于 2013-10-11T09:05:10.020 回答