2013-08-30 5 views
7

2つの定義のいずれかまたは両方が設定されている場合、自動クラッシュログレポートを無効にしようとしています:デバッグビルドではDEBUG、インターナショナルビルドではINTERNATIONALです。しかし、私が#ifndefのケースでそれをやろうとすると、Extra tokens at end of #ifndef directiveという警告が出て、DEBUGで動作しているとCrittercismが発生します。ifndefと||を使用した条件付きコンパイル2番目のケースをキャッチしません

#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 

この真理値表は、私が期待するものを示しています。

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

これは、それだけで#ifndef INTERNATIONALたときの前に働いていました。私もdefined(blah)なしで試してみましたが、文全体で括弧で囲まれています(それぞれ同じ警告とエラーがあります)。

コンパイラから必要な動作を取得するにはどうすればよいですか?

答えて

13

あなたが欲しい:

あなたが行うことができます
#if !defined(INTERNATIONAL) && !defined(DEBUG) 
    // neither defined - setup Crittercism 
#else 
    // one or both defined 
#endif 

または:

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

これは、それを修正し、感謝を。複雑な条件文を防ぐ '#ifndef'について何か知っていますか? – thegrinner

+0

'#ifdef'や'#ifndef'を 'defined()'と組み合わせることはできません。 '#ifdef'と'#ifndef'は一つの値だけをチェックすることができます - '#ifndef INTERNATION'。 – rmaddy

関連する問題