2016-04-27 12 views
1

我有這樣的事情:有什麼方法可以檢查使用預處理器的語言變量是否存在?

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

回答

2

添加以下線附近.m文件的頂部(在任何方法以外):

MyLogSetPrefix(MyDefaultLogPrefix); 

這將導致:

static NSString * const MyLogPrefix = @"MyApp"; 

被宣佈爲一個文件全局變量。

現在任何沒有自己的本地MyLogSetPrefix的方法將使用此文件全局。

+0

我喜歡這個!現在,如果我將日誌文件拉出到它自己的文件中,我只需在該文件中執行該操作,並在導入後自動將其放入.m文件中!那麼唯一的問題是,如果我想要一個整個文件的日誌前綴:/ –

+0

有什麼辦法使默認的日誌前綴成爲導入它的文件的名稱? –

+1

嘗試使用'__FILE__'宏,看看有什麼給你。 – rmaddy

相關問題