#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x) {return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b))); //400
}
そして今度は、この関数に邪悪なもの、つまり副作用を追加してみましょう。
#define min(A,B) ((A)<(B)?(A):(B))
long Foo(int x){
Print("Увидивший это второй раз - нубяра vulgaris");
return x*x;}
voidOnStart(void)
{
int a=500,
b=20;
Print(min(500,Foo(b)));
}
マーケットプレイス用の新しい製品を作成することは不可能です、エラー500と表示されます。
製品を作成し、確認したところ、公開されたと表示されましたが、リンクをクリックすると500という答えが表示されます。
テキストの置き換えとしてトップダウンで動作します。すなわち、"TMP "は "VALUE "に置き換わる。
これはコンパイラーではなく、プリプロセッサーです)
になる。
であり、VALUEは未定義である。
undefはどのように機能することになっているのですか?
undefはどのように機能することになっているのですか?
ここまでは、「テキストの置き換え」が行われています。
コンパイラーではなく、プリプロセッサーです)
になる。
であり、VALUEは未定義である。
正しく理解すると、VALUE*2 の値型は const で、置換自体と結びついている、つまり、VALUE も定数である。コンパイラは2つの定数を作成します。
もしそうなら、新しい代入を作成しているはずです。
#define VALUE VALUE1また、コード上のVALUEが定数として定義されていた場合、正しくありません。
ここまでは「テキストの置き換え」が行われている。
一致しない、後の行「#define VALUE (TMP*2)」でTMPをVALUEに 変更する。
辻褄が合わない、後の行「#define VALUE (TMP*2)」でTMPをVALUEに 変更。
そうして、代用品が延々と続き、すべてが終了する。
コードがあります。
最初の置換は、#undef VALUEまでのコード全体でVALUEを10に変更し、これを残しています。
次の置換でTMPは10になる。それが判明したのは
私はどこで間違っているのだろう?
コードがあります。
最初の置換は、#undef VALUEまでのコード全体でVALUEを10に変更し、これを残しています。
次の置換でTMPは10になる。それが判明したのは
私は何を間違えているのだろう?
TMPに代入されるのは10ではなく、VALUEなのですが、後でVALUEが定義されると(面倒ですが)10になります。
ステップバイステップでご覧ください。
プリプロセッサーは、忠実にPrint
そしてまた、何のトリックもなく、何を代用するのか?そうですね。
で、プリプロセッサのディレクティブをすべて消してしまい、その後に初めてコンパイラがこれを取得します。
TMPは10ではないが、VALUEがTMPに代入され、その後VALUEが定義されると(これは問題だが)10になる
ステップバイステップでご覧ください。
プリプロセッサーは、忠実に Print
そしてまた、何のトリックもなく、何を代用するのか?そうですね。
で、プリプロセッサのディレクティブをすべて消してしまい、その後に初めてコンパイラがこれを取得します。
これを「トップダウン」とは言いません。
トップダウンとは言いません。
すみません、説明しようとして混乱しました)))
もう1度
2回目のVALUE定義の時点では、VALUEマクロは定義されていないので、VALUEは次のように定義されます。
(VALUE*2)なぜなら、TMPは昔も今もVALUEで定義されているからです。
しかし、TMPは、2つ目のVALUEの定義の後、次のように展開される。
(TMP*2)(こんな感じ))
プリプロセッサは持っているものを埋めるだけで、どこでどのように定義されているかは関係ないのです。そのため、注意しなければならないことがあります。例
そして今度は、この関数に邪悪なもの、つまり副作用を追加してみましょう。
また、これはあくまで銘板ですが、この機能に依存する預金であればどうでしょうか。