アカウント名:
パスワード:
警告を無視しちゃいかんという教訓を得たと。
こんな感じに、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
要は、マクロを思うように展開してくれないけど、それでもマクロを使いたいから余分な処理を付け足したということ?余分な処理をつけることに罪悪感無いのかなあ。
Cでのイディオムのひとつです。いわゆるバッドノウハウの最たるものですけど。余分な処理()ってwwwwwオプティマイザが消しちゃいますよ。なので「余分な処理()」に関しては全然抵抗ありません。
より多くのコメントがこの議論にあるかもしれませんが、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)
要は、マクロを思うように展開してくれないけど、それでもマクロを使いたいから余分な処理を付け足したということ?
余分な処理をつけることに罪悪感無いのかなあ。
Re: (スコア:0)
Cでのイディオムのひとつです。
いわゆるバッドノウハウの最たるものですけど。
余分な処理()ってwwwww
オプティマイザが消しちゃいますよ。
なので「余分な処理()」に関しては全然抵抗ありません。