Ich versuche automatische Crash-Log-Berichte zu deaktivieren, wenn eine oder beide der beiden Definitionen gesetzt sind: DEBUG
für unsere Debug-Builds und INTERNATIONAL
für die internationalen Builds. Wenn ich das im #ifndef
Fall versuche, bekomme ich jedoch die Warnung Extra tokens at end of #ifndef directive
und läuft mit DEBUG
definiert wird Crittercism auslösen.Bedingte Kompilierung mit ifndef und || Fängt keinen zweiten Fall ein
#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
Diese Wahrheitstabelle zeigt, was ich erwarten:
INTL defined | DEBUG defined | Crittercism Enabled
F | F | T
F | T | F
T | F | F
T | T | F
Dies gearbeitet, als es war nur #ifndef INTERNATIONAL
. Ich habe auch ohne die defined(blah)
und mit Klammern um die ganze Aussage versucht (gleiche Warnung und ein Fehler beziehungsweise).
Wie bekomme ich das Verhalten, das ich vom Compiler will?
Dies behebt es, danke. Weißt du, ob es etwas über '# ifndef' gibt, das komplexe Bedingungen verhindert? – thegrinner
Sie können '# ifdef' oder' # ifndef nicht mit 'defined()' kombinieren. Und '# ifdef' und' # ifndef' können nur einen einzigen Wert prüfen - '#ifndef INTERNATIONAL'. – rmaddy