4

以下のコードは、「定義済み」、「定義なし」、および「はい」という出力を生成します。なんで?

#define FOOBAR NO
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
#ifdef YES
    NSLog(@"yes defined");
#endif

#ifdef NO
    NSLog(@"no defined");
#endif

#if FOOBAR == YES
    NSLog(@"yes");
#else
    NSLog(@"no");
#endif
    // ...
}

YES と NO は未定義ではなく、objc.h では次のように定義されています。

typedef signed char     BOOL;
#define YES             (BOOL)1
#define NO              (BOOL)0
4

2 に答える 2

4

の価値はNO何ですか?未定義の場合(のようにYES)、両方とも0と評価されます

これはあなたの表現が本質的に

#if 0 == 0

もちろんこれは真実であり、したがって最初の呼び出しがコンパイルされます。

更新:どのようBOOLに定義されているかはわかりませんが、プリプロセッサを扱う場合、:ed型である可能性のあるものにキャストすることはtypedefあまり良い考えではありません。#ifはコンパイラではなくプリプロセッサによって評価されることに注意してください。プリプロセッサの式の詳細については、このようなものをお読みください。特に:

プリプロセッサは、言語の型について何も知りません。

于 2012-10-04T10:07:38.437 に答える
4

プリプロセッサが認識していないすべての識別子は、ディレクティブ0での評価のために置き換えられます。#if定義しておらずYESNO両方が定義されている0(したがって等しい)場合。

于 2012-10-04T10:07:57.563 に答える