ios - 取 NSString 占位符的 C 函数宏

标签 ios objective-c macros c-preprocessor

在我的 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/

相关文章:

ios - 在没有WebView的应用程序中加载Youtube视频

ios - 为什么当我切换到上一屏幕时,iCarousel View 中的图像显示在上一屏幕中?

检查 int 是否被定义为宏。 C

c - printf 给出错误的输出

没有标记字符串的宏的 cpp 扩展

ios - 如何安装更新的 swift-tools-version?

ios - 核心数据子有序集

ios - UISplitViewController - 隐藏主滑入 View

objective-c - NSScanner - 将下一行扫描到字符串中

iphone - 你怎么知道 pushViewController 保留了推送的对象?