0
#ifdef doesn't work. But why? 

CGFloat maxScale;

if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
    NSLog (@"case1");
#define GLOBAL1
}
else 
{
    NSLog (@"case2");
#undef GLOBAL1
}

#ifdef GLOBAL1
NSLog (@"first");
maxScale = 1.0 / [[UIScreen mainScreen] scale];
#else
NSLog (@"second");
maxScale = 1.0;
#endif

#undef GLOBAL1

私のログ: ケース 1、2 番目。しかし、最初は case1 でなければなりません。

4

2 に答える 2

4

#define#ifdefプリプロセッサ マクロ/条件です。つまり、それらに含まれるロジックは、コードがコンパイルされる前にコンパイルされます。実際にはコードの一部ではありません。

プリプロセッサ マクロ/条件とは何か、またその機能については、このガイドを参照してください。


[編集]

これは、コードを読み取るときにプリプロセッサが認識するものです。

#define GLOBAL1
#undef GLOBAL1

#ifdef GLOBAL1
   //...
#else
   //...
#endif

#undef GLOBAL1

他のすべてのコードとロジックを無視します。

これは、コンパイラが作成する実際のコード出力です。

if ( [[UIScreen mainScreen] respondsToSelector: @selector (scale)] == YES )
{
    NSLog (@"case1");
}
else 
{
    NSLog (@"case2");
}

// because the pre-processor #undef GLOBAL1
NSLog (@"second");
maxScale = 1.0;

プリプロセッサ コードは「実行」され、コンパイラにコンパイル方法を伝えますが、実行時に使用または実行されることはありません。

それが役立つことを願っています!

于 2011-01-14T16:20:00.530 に答える
1

プリプロセッサは、コード化された if ステートメント内にあることを気にしません#define。コードの前に処理され、他のプリプロセッサ定義のみを気にします。#definesおよびその他のプリプロセッサ コマンド ( など) をコードとして使用することはできません#undef。コードが条件分岐に入るたびにヒットすることはありません。

于 2011-01-14T16:23:12.947 に答える