switchと初期化
楽しげなことなので横やりです。
ここで問題になっているのは、「宣言」ではなくて「初期化」です。
404 Not Found
とりあえず、問題は初期化を飛び越えること
switch と初期化 - odz buffer
私はいまだにスコープってものが分かってないコトがバレバレなコード。
敗北 - c⌒っ_д_)っ←のや
何故駄目なのかさぁ、みんなで考えよう!
って冗談ですが、
int hoge = 2; switch(hoge) { case 1: int one = 1; case 2: printf("%d\n",one); break; }
これはコンパイルエラー!
oneは参照できるけど、初期化コードを通らない(可能性がある)から。
=1を書かない場合は、コンパイルは通るけど値はもちろん不定。
要するに、
goto GOGOGO; int gogogo = 100; GOGOGO:
これが既に不法。
え、switchじゃん、とか思うかもですがswitchなんて所詮ジャンプテーブルですよ。
(場合によるけど)
そう、これを根本的に解決するには
スコープの先頭でしか宣言できないcに戻る時が今ということ!(冗談です
もうちょっと書いておこう。
JP GOGOGO LD A,1 GOGOGO:
当たり前だけどコードにおちたときこんなのは合法。(Z80のつもり)
ただ要するに
cの構文上において、
その変数は
初期化コードを飛び越した場合、
「初期化されているの?」
「不定なの?」
っていうのが問題なんじゃないですかなぁ。(憶測でものを言う男)*1
*1:コードに落ちた場合、gotoによる未通過時だけ不定になるとかしたらきっとかなりめんどいから=宣言された場所でメモリ確保され初期化されているとは限らないため