web-dev-qa-db-ja.com

#ifと#ifdef Objective-Cプリプロセッサマクロの違いは何ですか?

IPAD_BUILDやIPHONE_BUILDなどのビルド設定でプリプロセッサマクロを定義する方法(およびファクトリメソッドでそれらを使用する方法)

私は今これらを心から使っていますが、何が遅れているのかを知るのはクールでしょう。

38
Geri

/#ifは、次の場合に通常どおり機能します。

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    return YES;
  }
#endif
  return NO;
}

/#ifdefは、「定義されている場合-値またはマクロ」を意味します。

#ifdef    RKL_APPEND_TO_ICU_FUNCTIONS
#define RKL_ICU_FUNCTION_APPEND(x) _RKL_CONCAT(x, RKL_APPEND_TO_ICU_FUNCTIONS)
#else  // RKL_APPEND_TO_ICU_FUNCTIONS
#define RKL_ICU_FUNCTION_APPEND(x) x
#endif // RKL_APPEND_TO_ICU_FUNCTIONS

または:

#ifdef __OBJC__
    #import <Foundation/Foundation.h>
#endif

詳細については、このリンクを使用してください http://www.techotopia.com/index.php/Using_Objective-C_Preprocessor_Directives

IPadを実行しているかどうかをテストするには、次のようなsmthが必要です。

#define USING_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad

if (USING_IPAD) {
    NSLog(@"running iPad");
}

もう1つの便利なプリプロセッサ関数を次に示します。

#ifdef DEBUG
    //here we run application through xcode (either simulator or device). You usually place some test code here (e.g. hardcoded login-passwords)
#else
    //this is a real application downloaded from appStore
#endif
51
Stas

マクロは未定義にすることも、値なしで定義することも、値(場合によっては数値)で定義することもできます。例:

#undef MACRO
#define MACRO
#define MACRO ??????
#define MACRO 0
#define MACRO 1

#ifdef MACROまたは#if defined(MACRO)は、値の有無にかかわらずマクロが定義されているかどうかを確認します。

#if MACROはマクロ定義を置き換えます。マクロが定義されていない場合、0を代入します。次に、見つかった式を評価します。上記の5つの例を取り上げると、#if MACROは次のようになります。

#if 0
#if
#if ??????
#if 0
#if 1

番号2および3は、コンパイル時エラーを示します。番号1と4はfalseと評価されるため、次のコードはスキップされます。番号5はtrueと評価されます。

#ifの方が柔軟性があります。

#if MACRO == 2

マクロが次のように定義されている場合にのみ、次のコードをコンパイルします

#define MACRO 2
11
gnasher729