2011-08-25 52 views
1

我在我的PCH文件中有以下宏。在PCH文件中定義一個給出警告的宏

#ifdef DEBUG 
    #define MYLOG(...) NSLog(__VA_ARGS__) 
#else 
    #define MYLOG(...) MYSERVERLOG(MYObject.enableLogging, __VA_ARGS__) 
#endif 

#define MYSERVERLOG(iLog, ...) iLog ? NSLog(__VA_ARGS__) : TRUE 

現在,無論我把DEBUG = 0還是DEBUG = 1,它總是進入第一個子句。但是,如果我在PCH中使用「if」而不是「ifdef」作爲DEBUG,那麼它可以正常工作,但是我會在所有MYLOG語句中發出警告,說明「表示結果未使用」。

我該如何擺脫這種情況?

回答

2

我猜你只有在DEBUG = 0時纔會得到警告。問題是,通過預處理程序運行後,編譯器看到這樣的代碼:

... 
MYObject.enableLogging ? NSLog(@"your log",...) : TRUE; 
... 

編譯器是細跟,讓你忽略了一個函數的結果,假設功能做你想要什麼,結果沒用。但是,當您經歷用三元運算符計算代碼中值的麻煩時,它期望您需要該計算的結果。如果你知道你將永遠不會使用這個宏的結果,你可以將它轉換爲void忽略它:

#define MYSERVERLOG(iLog, ...) ((void)(iLog ? NSLog(__VA_ARGS__) : TRUE)) 

如果你可以使用宏的結果,那麼你將不得不做演員的每當你使用宏並忽略結果,或者接受警告。在這種情況下,您仍然應該在您的宏中放置括號以避免可能出現的問題。

#define MYSERVERLOG(iLog, ...) (iLog ? NSLog(__VA_ARGS__) : TRUE) 
1

如果你做一個

#define DEBUG 0 

或者如果你做一個

#define DEBUG 1 

「調試」 宏定義,因此...

#ifdef DEBUG 

將永遠是真實的,因爲DEBUG被定義。

如果你想進入第二個子句,你將不得不確保在宏中沒有定義宏(即刪除宏或註釋掉它)。

+0

我知道了......但是當我一起刪除DEBUG時,我開始在上面的所有MYLOG語句中發出警告「表示結果未使用」。雖然它工作正常。你能告訴我爲什麼這些警告即將到來嗎? – Abhinav