有没有办法检查使用预处理器是否存在语言变量?

时间:2016-04-27 19:56:11

标签: objective-c c-preprocessor

我有这样的事情:

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

1 个答案:

答案 0 :(得分:2)

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

MyLogSetPrefix(MyDefaultLogPrefix);

这将导致:

static NSString * const MyLogPrefix = @"MyApp";

被声明为文件全局变量。

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