2013-08-30 5 views
7

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?

Antwort

13

Sie wollen:

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

Oder Sie tun können:

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

Dies behebt es, danke. Weißt du, ob es etwas über '# ifndef' gibt, das komplexe Bedingungen verhindert? – thegrinner

+0

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