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?
To rozwiązuje go, dzięki. Czy wiesz, że w '# ifndef' jest coś, co zapobiega złożonym warunkom? – thegrinner
Nie można połączyć '# ifdef' lub' # ifndef' z 'defined()'. Natomiast '# ifdef' i' # ifndef' mogą sprawdzać tylko jedną wartość - '#ifndef INTERNATIONAL'. – rmaddy