2013-08-30 18 views
7

Próbuję wyłączyć raporty dzienników awarii, gdy ustawiona jest jedna lub obie z dwóch definicji: DEBUG dla naszych kompilacji debugowania i INTERNATIONAL dla kompilacji międzynarodowych. Kiedy jednak spróbuję to zrobić w przypadku #ifndef, otrzymam ostrzeżenie Extra tokens at end of #ifndef directive, a uruchomienie z DEBUG zdefiniowanym spowoduje uruchomienie Crittercism.Kompilacja warunkowa z ifndef i || nie przechwytuje drugiego przypadku

#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 

Powyższa tabela pokazuje, co prawda ja się spodziewać:

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

To działało wcześniej, kiedy to było właśnie #ifndef INTERNATIONAL. Próbowałem również bez defined(blah) i nawiasów wokół całej instrukcji (odpowiednio samo ostrzeżenie i błąd).

Jak uzyskać zachowanie, które chcę z kompilatora?

Odpowiedz

13

Chcecie:

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

Albo można zrobić:

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

To rozwiązuje go, dzięki. Czy wiesz, że w '# ifndef' jest coś, co zapobiega złożonym warunkom? – thegrinner

+0

Nie można połączyć '# ifdef' lub' # ifndef' z 'defined()'. Natomiast '# ifdef' i' # ifndef' mogą sprawdzać tylko jedną wartość - '#ifndef INTERNATIONAL'. – rmaddy