2013-08-30 47 views
7

我試圖在設置兩個定義中的一個或兩個時禁用自動崩潰日誌報告:我們的調試版本爲DEBUG,國際版本爲INTERNATIONAL。然而,當我在#ifndef的情況下嘗試這樣做時,我得到了警告Extra tokens at end of #ifndef directive並且用定義的DEBUG運行會觸發Crittercism。使用ifndef和||進行條件編譯不捕獲第二種情況

#ifndef defined(INTERNATIONAL) || defined(DEBUG) 
    // WE NEED TO REGISTER WITH THE CRITTERCISM APP ID ON THE CRITTERCISM WEB PORTAL 
    [Crittercism enableWithAppID:@"hahayoudidntthinkidleavetherealonedidyou"]; 
#else 
    DDLogInfo(@"Crash log reporting is unavailable in the international build"); 

    // Since Crittercism is disabled for international builds, go ahead and 
    // registers our custom exception handler. It's not as good sadly 
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler); 
    DDLogInfo(@"Registered exception handler"); 
#endif 

這個真理表顯示我的期望:

INTL defined | DEBUG defined | Crittercism Enabled 
    F  |  F  | T 
    F  |  T  | F 
    T  |  F  | F 
    T  |  T  | F 

這時候它只是#ifndef INTERNATIONAL工作過。我也嘗試過沒有defined(blah),並在整個語句周圍加上括號(分別是相同的警告和錯誤)。

如何從編譯器中獲得我想要的行爲?

回答

13

你想:

#if !defined(INTERNATIONAL) && !defined(DEBUG) 
    // neither defined - setup Crittercism 
#else 
    // one or both defined 
#endif 

或者,你可以這樣做:

#if defined(INTERNATIONAL) || defined(DEBUG) 
    // one or both defined 
#else 
    // neither defined - setup Crittercism 
#endif 
+0

這修復它,謝謝。你知道是否有一些關於'#ifndef'的東西阻止複雜的條件? – thegrinner

+0

您不能將#ifdef或#ifndef與'defined()'結合使用。 '#ifdef'和'#ifndef'只能檢查一個值 - '#ifndef INTERNATIONAL'。 – rmaddy

相關問題