İ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:
sayesinde. Karmaşık koşulları önleyen # ifndef hakkında bir şey var mı? – thegrinner
'# ifdef' veya' # ifndef' işlevlerini 'define()' ile birleştiremezsiniz. Ve # ifdef' ve # ifndef' yalnızca tek bir değeri kontrol edebilir - '#ifndef INTERNATIONAL'. – rmaddy