アカウント名:
パスワード:
Cで組まなくなって長いけどgotoを使ったコードは久しぶりに見たOSのコードだからオーバヘッドを減らすためかもしれないけど違和感ありまくり
コメント読んでもヘンテコマクロの話ばかりで皆さん違和感ないのかないつもこんな感じのコードを書いてるんでしょうかね
「構造化プログラミングではgoto禁止」の原理主義にはまり込む流れ
step1 とりあえずgoto禁止
if (実行結果==err) { 後始末; return err; } if (実行結果==err) { 後始末; return err; } 後始末; return success;}
step2 後始末は一箇所にまとめたい
result = subfunc(&変数1,&変数2,…); 変数1, 変数2,…に対して後始末;
こんな感じですかね。#switch (0) { default: xxxx } って構文初めて見た
#define TRY(x) do { int thrown = 0; switch (0) { default:#define END_TRY }#define THROW(x) do { thrown = (x); break; }#define CATCH(x) if (thrown == (x)) {#define END_CATCH continue; }#define FINALLY } while (0);#define END_FINALLY #define ERROR 1 static OSStatusSSLVerifySignedServerKeyExchange(SSLContext *ctx, bool isRsa, SSLBuffer signedParams, uint8_t *signature, UInt16 signatureLen){ OSStatus status; ... TRY if (status = SSLHashSHA1.update(&hashCtx, &serverRandom), status) THROW(ERROR); if (status = SSLHashSHA1.update(&hashCtx, &serverRandom), status) THROW(ERROR); if (status = SSLHashSHA1.update(&hashCtx, &signedParams), status) THROW(ERROR); if (status = SSLHashSHA1.final(&hashCtx, &hashOut), status) THROW(ERROR); END_TRY CATCH(ERROR) ... END_CATCH FINALLY SSLFreeBuffer(&signedHashes); SSLFreeBuffer(&hashCtx); END_FINALLY return status;}
あらダメだ、THROWマクロにbreakは使えない
#define TRY(x) switch (0) { int thrown = 0; default: do {#define END_TRY } while (0);#define THROW(x) switch (0) { default: thrown = (x); continue; }#define CATCH(x) if (thrown == (x)) {#define END_CATCH break; }#define FINALLY }#define END_FINALLY
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
吾輩はリファレンスである。名前はまだ無い -- perlの中の人
gotoを久しぶりに見た (スコア:0)
Cで組まなくなって長いけどgotoを使ったコードは久しぶりに見た
OSのコードだからオーバヘッドを減らすためかもしれないけど
違和感ありまくり
コメント読んでもヘンテコマクロの話ばかりで皆さん違和感ないのかな
いつもこんな感じのコードを書いてるんでしょうかね
Re: (スコア:1)
「構造化プログラミングではgoto禁止」の原理主義にはまり込む流れ
step1 とりあえずgoto禁止
step2 後始末は一箇所にまとめたい
Re:gotoを久しぶりに見た (スコア:2)
こんな感じですかね。
#switch (0) { default: xxxx } って構文初めて見た
Re:gotoを久しぶりに見た (スコア:2)
あらダメだ、THROWマクロにbreakは使えない
Re:gotoを久しぶりに見た (スコア:2)