2009-07-17 8 views
0

の#defineディレクティブの質問

#ifdef LITE_VERSION 
    if (alertView.tag == 100) 
    { 
     if (buttonIndex == 1) 
     [ [UIApplication sharedApplication] openURL: buyAppLink]; 
     [alertView release]; 
     return; 
    } 
    #endif 

何:私が何をしたいか

#define checkLiteMessage \ 
{ \ 
    #ifdef LITE_VERSION \ 
    if (alertView.tag == 100) \ 
    { \ 
     if (buttonIndex == 1) \ 
     [ [UIApplication sharedApplication] openURL: buyAppLink]; \ 
     [alertView release]; \ 
     return; \ 
    } \ 
    #endif \ 
} \ 

は、私がcheckLiteMessageを呼び出すたびに含まれるために、次のコードを持っていることです私の問題?なぜこのコードはコンパイルされませんか?

ありがとうございました。

答えて

8

マクロは、行の継続が正しく指定されています。しかし、これは、#ifdef文が行の先頭にないことを意味します。したがって、プリプロセッサはそれを実行しません。

マクロ内に#ifdefを埋め込むことはできません。あなたはそれを逆にすることができます:

#ifdef LITE_VERSION 
#define checkLiteMessage do { \ 
    if (alertView.tag == 100) \ 
    { \ 
     if (buttonIndex == 1) \ 
     [ [UIApplication sharedApplication] openURL: buyAppLink];  \ 
     [alertView release]; \ 
     return; \ 
    } \ 
} while(0) 
#else 
#define checkLiteMessage do { ; } while (0) 
#endif 

マクロ内に 'return'ステートメントを入れることはかなり悪いことであり、誰もが混乱することになります。それをしないでください。バックスラッシュ - 改行の組み合わせは全く文字に相当する

+0

+1、確かにそれを解決する良い方法:) –

+0

スピードタイピングコースは必須でなければなりません。よくやった。 –

1

よう

#define x y \ 
    z 

#define x y z 

と同等である。また、規格によれば、マクロ本体でプリプロセッサディレクティブではありません展開または解釈され、その間に条件付きでコードをドロップするのではなく、#ifdefがコンパイラに渡されます。

あなたは内容

#define x y \ 
    z 

#define v \ 
     #ifdef E 

x 

v 

とコマンドgcc -E a.cでそれを前処理でファイルa.cを作成し、この動作を検査することができます。あなたが何をする必要があるか、あなたの状況では

は、

#ifdef LITE_VERSION 
#define checkLiteMessage \ 
{ \ 
    if (alertView.tag == 100) \ 
    { \ 
     if (buttonIndex == 1) \ 
     [ [UIApplication sharedApplication] openURL: buyAppLink];  \ 
     [alertView release]; \ 
     return; \ 
    } \ 
} 
#else 
#define checkLiteMessage 
#endif  
0

プリプロセッサは唯一のパスです。したがって、シーケンス#ifdefがコンパイラに到達しているため、エラーが発生します。それを関数にする。

+0

これはワンパスだけではありません。プリプロセッサディレクティブは展開されませんが、マクロは特定の展開中に2度目の名前に達するまで展開されます。 –

3

問題は、プリプロセッサディレクティブをマクロに含めることができないことです。 あなたはその代わりに、やりたいことがあります。

また
#ifdef LITE_VERSION 
#define checkLiteMessage \ 
{ \ 
    if (alertView.tag == 100) \ 
    { \ 
     if (buttonIndex == 1) \ 
     [ [UIApplication sharedApplication] openURL: buyAppLink];  \ 
     [alertView release]; \ 
     return; \ 
    } \ 
} 
#else 
#define checkLiteMessage 
#endif 

は「リターン」ラインは、あなたがここに(それがないと思う何をしていることを確認し、それはcheckLiteMessageだけでなく、マクロを呼び出す関数を終了(マクロにすることはできません"終了")