【问题标题】:C function macro to take NSString placeholders取 NSString 占位符的 C 函数宏
【发布时间】:2013-10-19 06:29:10
【问题描述】:

在我的 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 抱怨:“提供给类似函数的宏调用的参数太多”。

【问题讨论】:

    标签: ios objective-c macros c-preprocessor


    【解决方案1】:

    首先,您必须更改 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]);
    

    应该都可以正常工作。

    【讨论】:

    • 这正是我所需要的。谢谢!
    • 谢谢.. NSArray 参数的解决方案是什么??
    猜你喜欢
    • 1970-01-01
    • 2023-03-31
    • 2011-07-26
    • 2011-08-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 2013-11-11
    • 2010-11-01
    相关资源
    最近更新 更多