アカウント名:
パスワード:
警告を無視しちゃいかんという教訓を得たと。
こんな感じに、if分を一行にまとめてしまえば、こんな不具合出なかった気がします。
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail;if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail;if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail;
一行が長くなるのを嫌ったのかな?
#define ErrorCheck(f) do { if ((err = f) != 0) goto fail; } while (0)
ErrorCheck(SSLHashSHA1.update(&hashCtx, &serverRandom));ErrorCheck(SSLHashSHA1.update(&hashCtx, &signedParams));ErrorCheck(SSLHashSHA1.final(&hashCtx, &hashOut));
ってやりたくなるんだけど、ダメ?
do while いるの?
do whileがなかったら、if ( foo == true ) ErrorCheck()else ErrorCheck()これがif ( foo == true ) if(~) goto fail;else if(~) goto fail;になってしまう。凡ミスを防ぐための処理。fooがtrueでない場合にelseのほうを実行してほしいのに、マクロ展開すると、fooがfalseだとなにも実行されないという。まぁ、これもカッコつけろよって話なんだけど。
doとwhile(0)が必要な理由になってないんだけど・・・
マクロ関数を普通の関数のように最後に ; を付けて適切に展開されるようにするため。
do while (0) なしだと
if () ErrorCheck(...);else ErrorCheck(...);
が
if () { ... };else { ... };
となり、 if の終わりの {} の後の ; が空文となるので、 else の行で文法エラーとなる。
do while (0) ありだと
if () do { ... } while (0);else
do~while(0)を使う理由はわかったが、if、elseには必ず{~}をつける、というルールを徹底した方が良い。レビューの度にこういう議論をしたくない。
#2550910だけど、私もそう思う。if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。
考えてみたら、defineマクロにgoto入れられてたら、do while関係なしに投げ捨てたくなるわ。
スマホで書き込んでるから、説明簡素化しすぎて伝えられなくてごめん。詳細に書いてくれた人ありがとう。
> if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。#2553818参照
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家
unreachable codeの警告は無視されたのか (スコア:0)
警告を無視しちゃいかんという教訓を得たと。
こんな感じに、if分を一行にまとめてしまえば、こんな不具合出なかった気がします。
if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail;
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail;
if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail;
一行が長くなるのを嫌ったのかな?
Re: (スコア:0)
#define ErrorCheck(f) do { if ((err = f) != 0) goto fail; } while (0)
ErrorCheck(SSLHashSHA1.update(&hashCtx, &serverRandom));
ErrorCheck(SSLHashSHA1.update(&hashCtx, &signedParams));
ErrorCheck(SSLHashSHA1.final(&hashCtx, &hashOut));
ってやりたくなるんだけど、ダメ?
Re: (スコア:0)
do while いるの?
Re: (スコア:0)
do whileがなかったら、
if ( foo == true )
ErrorCheck()
else
ErrorCheck()
これが
if ( foo == true )
if(~) goto fail;
else
if(~) goto fail;
になってしまう。凡ミスを防ぐための処理。
fooがtrueでない場合にelseのほうを実行してほしいのに、マクロ展開すると、fooがfalseだとなにも実行されないという。
まぁ、これもカッコつけろよって話なんだけど。
Re: (スコア:0)
doとwhile(0)が必要な理由になってないんだけど・・・
Re: (スコア:1)
マクロ関数を普通の関数のように最後に ; を付けて適切に展開されるようにするため。
do while (0) なしだと
if ()
ErrorCheck(...);
else
ErrorCheck(...);
が
if ()
{ ... };
else
{ ... };
となり、 if の終わりの {} の後の ; が空文となるので、 else の行で文法エラーとなる。
do while (0) ありだと
if ()
ErrorCheck(...);
else
ErrorCheck(...);
が
if ()
do { ... } while (0);
else
Re:unreachable codeの警告は無視されたのか (スコア:0)
do~while(0)を使う理由はわかったが、
if、elseには必ず{~}をつける、というルールを徹底した方が良い。
レビューの度にこういう議論をしたくない。
Re: (スコア:0)
#2550910だけど、私もそう思う。
if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。
考えてみたら、defineマクロにgoto入れられてたら、do while関係なしに投げ捨てたくなるわ。
スマホで書き込んでるから、説明簡素化しすぎて伝えられなくてごめん。
詳細に書いてくれた人ありがとう。
Re: (スコア:0)
> if文はカッコがないとコンパイルエラーにしちゃえばいいのにねぇ。
#2553818参照