8

#if#ifdef#ifndef#else#elif、および#endifを使用したことはありません 。

いくつかのソースコードを調べていると、これらのディレクティブが広範囲に使用されていることがわかりました。条件付きプリプロセッサについていくつか読んだことがありますが、通常の条件付きステートメントとどう違うのかなどの手がかりは見つかりませんでした。だから私は次のコードの利点は何だろうと思っていました:

#include<iostream>
int main()
{
    int i = 0;

    #if i == 0
         std::cout<<"This";
    #else
         std::cout<<"That";
    #endif
    return 0;
}

これについて:

#include<iostream>
int main()
{
    int i = 0;

    if (i == 0)
         std::cout<<"This";
    else
         std::cout<<"That";
    return 0;
}

また、いつ条件付きプリプロセッサを使用する/使用しないのですか?

4

5 に答える 5

5

条件付きプリプロセッサは、最初の例のようには機能しません。

定数で動作していますね。コンパイル時には、さまざまな条件を見て、それに応じてソースコードを挿入/省略します。

例えば:

#define HAS_COMPARISON

int main() {
    #ifdef HAS_COMPARISON
        int i = 0;
        if(i == 0) std::cout << "This";
        else
    #else
        std::cout << "That";
    #endif
}

defineセットを使用すると、変数を設定してi比較を実行します...つまり、出力しますThis。その定義にコメントすると、ブロック全体がプログラムに含まれなくなりますThat。つまり、変数を設定したり比較を行ったりすることなく、常に が出力されます。

これは、プリプロセッサ定義の最も一般的な使用法です。値を定義し、それらを比較して、同じ定義でさまざまな動作をすることもできますが、それは別の問題です。

繰り返しになりますが、条件付きプリプロセッサはコンパイル時に評価され、可変条件は実行時に評価されます。

于 2013-06-09T07:06:13.167 に答える
5

あなたが示した例は、他の情報が不足しているため、役に立たないようです。しかし、これ#ifは便利な例です。

#if OS == LINUX
//do something
#elif OS == SOLARIS
//do something else
#else
//
#endif

重要なのは#if、コンパイル時に評価されることですがif、プログラムの実行時に評価されます。

#if BYTE_ORDER == LITTLE_ENDIAN
//do something
#else
//do something else
#endif
于 2013-06-09T07:09:00.743 に答える
2

この場合のプリプロセッサ ディレクティブの使用は、まったく役に立ちません。しかし、これらのプリプロセッサ ディレクティブの使用は、他の多くの場合に役立ちます。

これらのプリプロセッサ ディレクティブは、条件付きコンパイルに使用できます。たとえば、あるプログラムを複数のプラットフォーム用に開発する必要がある場合、プラットフォーム固有の定数に値を指定できます。これらの値を変更すると、プラットフォームに固有のコンパイルを実行でき、コード全体を 1 つの大きなエンティティとして維持できます。

これらは、デバッグ中にも役立ちます。テスト ユニットは、デバッグ中にこれらの条件付きコンパイルを使用してコードにコンパイルし、実行することができ、これらを使用してコンパイルを停止することができます。

于 2013-06-09T07:10:09.303 に答える
1

プリプロセッサの利点は、コードがスローされることです。コンパイルされず (時間がかかります)、RAM にロードされるマシン コードを生成しません。決定が非常にタイトなループで何度も実行される場合、速度が向上する可能性があります。ただし、実際に時間を計らない限り、これが重要であると思い込まないでください。

プリプロセッサの欠点は、明らかにコンパイル時に答えを知っている必要があることです。ソース コードには、実行されない可能性のある多くのコードが含まれています。これらのコンパイル時の値が何であったかを判断することはしばしば困難であるため、人間が追跡するのは難しくなります。

于 2013-06-09T07:05:30.973 に答える
1

条件付きコンパイルとは、ifdef で指定されたコードが最終的にリンクされたアプリケーションに実際に存在しないことを意味します。言語条件を使用するだけで、両方のブランチが最終的なコードに含まれ、コードが大きくなり、テストが難しくなる可能性があることを意味します。

#ifdefコンパイル時に必要なものがわかっている場合は、 etc を使用します。言語条件は、実行時まで必要なものがわからない場合に使用されます。

于 2013-06-09T07:05:09.877 に答える