質問

次のコードがあります

#define PROC_ADD

void main(void)
{
    while(1)
    {
#ifdef PROC_ADD
// Do this code here then undefined it to run the code in the else
// processing work
#undef PROC_ADD
#else
// now that PROC_ADD has been undefined run this code
// processing work
#endif
    }
}

ただし、コードは実行されます。ただし、 PROC_ADD が定義解除された後は、 else のコードは実行されません。

その理由は、実行時ではなくコンパイル時にのみ定義および定義解除できるためだと思います。しかし、私は本当にわかりません。

役に立ちましたか?

解決

あなたがしていることは、以下と同等のビルド時間です:

int x = 1;

int main()
{
    if (x)
    {
        ...
        x = 0;
    }
    else
    {
        ...
    }
}

ifdefなどはビルド時に発生しますが、あなたの例では、それは問題ではありません。 if(ランタイムまたはビルド時のフォーム)を評価したら、それをどのブランチにするかを決定します。決定が行われた後に何かを変更しても、その決定は変更されません。

他のヒント

ifdef 条件は、プリプロセッサが到達すると評価されます。 ifdef 'dコード内で undef PROC_ADD を実行すると、プリプロセッサはすでにコードのどのセクションを含め、どのセクションを無視するかを決定しています。

さらに、はい: ifdef undef などは前処理時に処理されます-コンパイラはこれらのいわゆるディレクティブを見ることさえありません。もちろん、これは実行時コードがこれらのディレクティブをまったく参照しないことを意味します。

編集:プリプロセッサは、テキストファイルを1回パスすることで機能します。プリプロセッサは、テキストファイルにCコードが含まれていることを気にしません。あなたの ifdef sと else sと、 while ループ内に何が起きているかについての知識はありません。

#define sは前処理中にのみ機能します。だから

#define PROC_ADD 
void main(void) 
{
#ifdef PROC_ADD 
// Do this code here then undefined it to run the code in the else 
// processing work 
#undef PROC_ADD 
#else 
// now that PROC_ADD has been undefined run this code 
// processing work 
#endif 
}

は次のように処理されます。 PROC_ADDR が定義されているため、プリプロセッサは #else ブランチを完全に除外し、 #undef を実行します。そのため、 #else ブランチコードは前処理を生き延びず、コンパイラに到達しません。

ほぼすべてのプログラミング言語または構文で、実行が条件の1つのブランチに入ると(この場合、条件は #ifdef であり、ブランチの実行中に条件が変わっても、他のブランチは実行されません。

これで" Hello"と表示されるとは思わないでしょうか?

if (i == 1)
    i = 0;
else
    printf("Hello\n");

基本的にあなたが言っているのは、 else ブランチの下のコードが常に実行され、ブランチからそれを取り出して、コードに直接入れる >。

コンパイラと実行の両方が条件を1回だけ通過します。一致が見つかると、それ以上検索しません。

2番目のコメントセクションで表されるコードを常に常に実行したいですか?なぜしないのですか

#ifdef PROC_ADD
// Do the stuff to be done if PROC_ADD is defined
#undef PROC_ADD
#endif
// Do the stuff to always be done

編集

OK-実行時の動作を変更する場合は、実行時の構成(フラグとして機能する変数など)を使用する必要があります。 ;)と言っているように、プリプロセッサディレクティブはコンパイル時に1回だけ評価されます。

このように考えてください: x false false に設定されていても、次のコードの else 部分は実行されませんcode> if セクション。

条件は if(x)行自体でチェックされます-そのブロックに入ると、後続の else セクションのそれぞれは再計算されません-コンパイラーは既にその決定を下しています。

bool x = true;
if(x)
{
  //do something
  x = false;
}
else
{
  //else code
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top