#define、#ifdef #undef #endif
-
05-07-2019 - |
質問
次のコードがあります
#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
}