2013-08-30 22 views
7

İki tanımdan biri veya her ikisi de ayarlandığında, otomatik kilitlenme günlükleri raporlarını devre dışı bırakmaya çalışıyorum: hata ayıklama yapıları için DEBUG ve uluslararası kuruluşlar için INTERNATIONAL. #ifndef durumunda bunu yapmaya çalıştığımda, Extra tokens at end of #ifndef directive uyarısını alıyorum ve DEBUG ile çalışan tanımlı Crittercism'i tetikleyeceğim. ifndef ve || ile koşullu derleme ikinci durumda yakalanmıyor

#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 

Bu doğruluk tablosu

ne beklemek gösterir:

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

Bu sadece #ifndef INTERNATIONAL iken önce çalıştı. Ayrıca defined(blah) olmadan ve tüm ifadenin etrafında parantez ile denedim (sırasıyla, aynı uyarı ve bir hata).

Derleyiciden istediğim davranışı nasıl alırım?

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

Yoksa yapabilirsiniz:

cevap

13

istiyorsun

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

sayesinde. Karmaşık koşulları önleyen # ifndef hakkında bir şey var mı? – thegrinner

+0

'# ifdef' veya' # ifndef' işlevlerini 'define()' ile birleştiremezsiniz. Ve # ifdef' ve # ifndef' yalnızca tek bir değeri kontrol edebilir - '#ifndef INTERNATIONAL'. – rmaddy

İlgili konular