2

iOSでの#defineマクロの使用と、それらがコンパイル時のみで実行されているのか、実行時でも実行されているのかについて、矛盾する情報を読んでいます。

私の場合を考えてみましょう。画面が大きいサイズか小さいサイズかに関するBOOLを返すマクロを定義したいのですが、コードは次のとおりです。

#define TTThisScreenWidth [[UIScreen mainScreen] bounds].size.width
#define TTLargeScreenTrushHold 700.0f
#define TTScreenIsOfLargeSize (TTThisScreenWidth > TTLargeScreenTrushHold)

問題:このコードがコンパイル時にのみ実行される場合、画面サイズはコンパイル先のデバイスで修正され、別の画面のデバイスで実行すると正しい答えが返されません。

しかし、私はそれをチェックアウトしました、そしてそれは最初にiPhone(ユニバーサルアプリ)のためにコンパイルされたとき、iPad上で完全に動作します

SO:そうしないのは安全ですか?

ありがとう!

4

4 に答える 4

5

マクロはコンパイル時に置き換えられます。コンパイル時には実行されません。マクロの本体は、手動で入力した場合と同様に、マクロの名前への参照の代わりに「貼り付け」られます。

一般に、コンパイラは、マクロの有無にかかわらず、コンパイル時に定数式を評価します。定数式は含まれていませTTThisScreenWidthん。これは実行時の式であるため、実行時に評価されます。

于 2012-06-28T13:10:55.793 に答える
4

マクロは、Cプリプロセッサにその値をその名前に置き換えるように指示します。メソッドや関数、またはその他の複雑なものは実行されません。コードで、次のようにマクロを使用する場合TTScreenIsOfLargeSize

if (TTScreenIsOfLargeSize) {
    /* ... */
}

これは実際には次のように評価されます。

if ([[UIScreen mainScreen] bounds].size.width > 700.0f) {
    /* ... */
}

[UIScreen mainScreen]などはコンパイル時に評価されないためです。

于 2012-06-28T13:10:48.850 に答える
1

#define定数とマクロを定義するために使用されるプリコンパイルされた派生語です

使い方:

この例を考えてみましょう

#define MYINT 5
#define MYSTRING @"number is %d"

.mファイル内

NSString *str = [NSString stringWithFormat:MYSTRING, MYINT];
//What really happens is
NSString *str = [NSString stringWithFormat:@"number is %d", 5];

各定義は、それが定義する値またはコードに置き換えられます

于 2012-06-28T13:11:34.283 に答える
1

ここで、C前処理エンジンには#if、#ifdef、#endifなどのケースがありますが、質問で指定されたケースでは、プリプロセッサエンジンはTEXT置換エンジンとして機能することに注意してください。 。

これが、次のようなことをすると言う理由です。

#define varA 10
#define varB 20
#define addAB varA + varB

実際にコンパイルされたコードでaddABの呼び出しがある場合、それは「varA+varB」に置き換えられます。次のように数学演算を実行することは、常に良い習慣です。

#define addAB (varA + varB)

これはなぜですか:addABの最初の定義を単純に使用する場合、次のようなことをした場合:

myVar = 5 * addAB;

その場合、テキスト置換エンジンは次のようになります。

myVar = 5 * varA + varB;

コンパイルする前に。元の意図が乗算の前に最初にaとbを追加することであった場合、これは結果にはなりません。代わりに2番目が使用される場合、次のようになります。

myVar = 5 * (varA + varB);

コンパイル前の結果の式になり、これで必要なものが得られます。これらの場合のプリプロセッサはSIMPLETEXT置換エンジンであることを思い出すと、遠くまで行くことができます。

于 2012-06-28T14:09:14.760 に答える