在我的 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 提示:“为类似函数的宏调用提供了太多参数”。
最佳答案
首先,您必须更改您的 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]);
两者都应该可以正常工作。
关于ios - 取 NSString 占位符的 C 函数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19313675/