【问题标题】:Is there any way to check if a language variable exists using preprocessors?有没有办法使用预处理器检查语言变量是否存在?
【发布时间】:2016-04-27 19:56:11
【问题描述】:

我有这样的事情:

static NSString * const MyLogPrefixFormat = @"%@ - %@";
static NSString * const MyDefaultLogPrefix = @"MyApp";
#define MyLogSetPrefix(newPrefix) ; static NSString * const MyLogPrefix = newPrefix;
#define MyLogManualPrefix(messagePrefix, logMessage, args...) NSLog([NSString stringWithFormat:MyLogPrefixFormat, messagePrefix, logMessage], ##args);
#define MyLog(logMessage, args...) MyLogManualPrefix(MyLogPrefix, logMessage, ##args);

- (void)myMethod
{
    MyLogSetPrefix(@"myMethod");

    MyLog(@"Message One with args 1 (%@) and 2 (%@)", arg1, arg2);
    MyLog(@"Message Two");
}

扩展至此:

- (void)myMethod
{
    static NSString * const MyLogPrefix = @"myMethod";

    NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
    NSLog([NSString stringWithFormat:@"%@ - %@", MyLogPrefix, @"Message Two"]);
}

但是,我也希望它这样做:

- (void)myMethod
{
    MyLog(@"Message One", arg1, arg2);
    MyLog(@"Message Two");
}

扩展至此:

- (void)myMethod
{
    NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message One with args 1 (%@) and 2 (%@)"], arg1, arg2);
    NSLog([NSString stringWithFormat:@"%@ - %@", MyDefaultLogPrefix, @"Message Two"]);
}

要实现第二个要求,我需要检查是否设置了 MyLogPrefix 常量。因为它是static NSString * const 而不是#define,所以我不能使用#ifdef如何判断MyLogPrefix 常量是否存在,如果不存在,使用MyDefaultLogPrefix

【问题讨论】:

    标签: objective-c c-preprocessor


    【解决方案1】:

    在 .m 文件顶部附近添加以下行(在任何方法之外):

    MyLogSetPrefix(MyDefaultLogPrefix);
    

    这将导致:

    static NSString * const MyLogPrefix = @"MyApp";
    

    被声明为文件全局变量。

    现在任何没有自己的本地 MyLogSetPrefix 的方法都将使用这个文件全局。

    【讨论】:

    • 我喜欢这个!现在,如果我将日志内容提取到它自己的文件中,我只需在该文件中执行此操作,它会在导入时自动放入 .m 文件中!那么,唯一的问题是,如果我想要整个文件的日志前缀:/
    • 有没有办法让默认的日志前缀作为导入它的文件名?
    • 尝试使用__FILE__ 宏,看看它能给你带来什么。
    • 给出整个路径的DX
    猜你喜欢
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多