0

以下のコードがあります。反復PORT後の定義を解除したい場所。5しかし、このプログラムを実行しているとき、出力は次のようになります

PORT
MOB
PORT
MOB...10 times

したがって、実行時に変更する場合は、どうすればよいですか。で宣言PORTしましたVS project->Propoties->C/C++->Preprocessor

int main()
{
    int i;
    for(i = 0; i <= 10; i++)
    {
#ifdef PORT
        printf("PORT\n");
#endif
        if(i == 5)
        {
#ifdef PORT
#undef PORT
#endif
#define MOB 1
        }
#if MOB
        printf("MOB\n");
#endif
    }
    return 0;
}
4

4 に答える 4

3

プリプロセッサ (名前が示すように) は、コンパイルの最初のステップとして (または、見方によっては、コンパイルが完了する前に) 行うことを行います。実行時に発生することは、以前に発生したことを制御できません。実行時にプリプロセッサによって行われたものを変更することはできません。

目的の効果を得るには、プリプロセッサ定義の使用から、通常の変数または通常のフロー制御の使用に変更できます。

for (int i=0; i<5; i++)
    printf("PORT\n");

for (int i=0; i<5; i++)
    printf("MOB\n");

...また:

for (int i=0; i<10; i++)
   printf(i < 5 ? "PORT\n", "MOB\n");

あなたはそれらについて言及していませんでしたが、C++ テンプレートにもほとんど同じ制限があることを付け加えておきます。テンプレートを使用すると、プログラムの残りの部分に従って結果を検査および変更することができますが、ほんのわずかです最終的に、テンプレート パラメーターは、コンパイル時にテンプレートを解決できるように、コンパイル時の定数である必要があります。

于 2013-11-05T09:04:00.450 に答える
2

不可能だよ。プリプロセッサ ディレクティブはコンパイルの一部です。ランタイム プリプロセッサのようなものはありません。実行時にディレクティブを変更することはできません。バイナリ ファイルは、プリプロセッサ ディレクティブを認識しません。

于 2013-11-05T09:03:17.773 に答える
1

これはできません。

プリプロセッサは、ソース ファイルがコンパイルされる前の最初のパスの 1 つとして実行されます。

プログラムの実行時にプリプロセッサを操作することはできません。代わりに通常の変数を使用してください。

于 2013-11-05T09:03:20.250 に答える
1

できません。プリプロセッサは、コンパイルの前に別のステップとして実行されます。実行時に行う方法はありません。

通常の変数を使用してif処理elseする必要があります。

于 2013-11-05T09:03:23.213 に答える