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)
なしで試してみましたが、文全体で括弧で囲まれています(それぞれ同じ警告とエラーがあります)。
コンパイラから必要な動作を取得するにはどうすればよいですか?
これは、それを修正し、感謝を。複雑な条件文を防ぐ '#ifndef'について何か知っていますか? – thegrinner
'#ifdef'や'#ifndef'を 'defined()'と組み合わせることはできません。 '#ifdef'と'#ifndef'は一つの値だけをチェックすることができます - '#ifndef INTERNATION'。 – rmaddy