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)
,並在整個語句周圍加上括號(分別是相同的警告和錯誤)。
如何從編譯器中獲得我想要的行爲?
這修復它,謝謝。你知道是否有一些關於'#ifndef'的東西阻止複雜的條件? – thegrinner
您不能將#ifdef或#ifndef與'defined()'結合使用。 '#ifdef'和'#ifndef'只能檢查一個值 - '#ifndef INTERNATIONAL'。 – rmaddy