23

ifまたは#if両方を条件チェックに使用できることを学びました。を使用して条件を確認できるifのに、なぜプリプロセッサを使用するのでしょう#ifか。

#ifの代わりに使用すると、コードにどのような違いがありifますか?

どちらを使用するのが良いですか、またその理由は何ですか?

4

5 に答える 5

45

if#ifは異なる目的を持つ異なるものです。

このステートメントを使用するifと、実行時に条件が評価され、両方の分岐のコードがコンパイル済みプログラム内に存在します。条件は、変数の状態などのランタイム情報に基づく場合があります。ifプログラムの標準的なフロー制御用です。

プリプロセッサの を使用する#ifと、条件はコンパイル時に評価され (元々これはコンパイル時より前でしたが、最近ではプリプロセッサは通常コンパイラの一部になっています)、false 分岐のコードはコンパイルされたプログラムに含まれません。 . #define条件は、コンパイル時の情報 (定数など) にのみ基づくことができます。#ifコンパイル時の環境ごとに異なるコードを使用するためのものです (たとえば、Windows と *nix でコンパイルするための異なるコード、そのようなもの)。

于 2013-05-08T10:51:33.873 に答える
15

#if1 つはコンパイル フェーズ ( ) で使用され、もう 1 つはランタイム フェーズ ( if)で使用されるため、どちらを使用するのが良いかはわかりません。

#if 1
   printf("this code will be built\n");
#else
   printf("this code will not\n");
#endif

上記のコードをビルドしてみるとgcc -E、コンパイラが以下のみを含む別のコードを生成することがわかります。

printf("this code will be build\n");

もう一方の printf は、新しいコード (プリ プロセッサ コード) には存在せず、プログラム バイナリにも存在しません。

結論: は#ifコンパイル フェーズでif処理されますが、通常はプログラムの実行時に処理されます。

#if 0コンパイラがコードをコンパイルするのを避けるために、コードの一部で を使用できます。この部分にコメントしたようです

int main(void) {

       printf("this code will be build\n");
#if 0
       printf("this code will not\n");
#endif

}

それは同等です

int main(void) {

       printf("this code will be built\n");
/*
       printf("this code will not\n");
*/

}
于 2013-05-08T10:51:01.723 に答える
7

おい、どっちも違うぞ

  1. #ifコンパイル時に条件が true かどうかをテストします。
  2. if実行時に評価されます。
于 2013-05-08T10:56:38.563 に答える
4

コンパイル時に条件の結果がわかっている場合は #if を使用し、実行時まで結果が不明な場合は通常を使用する必要があります。

#if DEBUG

コンパイル時にデバッグビルドを作成していることを知っています

if (date == DateTime.Today)

何日かにもよる

于 2013-05-08T10:51:35.803 に答える