2

switch次のようなステートメントを含むプログラムがあります。

switch(n)
{
case 0:
    /* stuff */
    break;

    int foo;
case 1:
    foo = 5;
    break;
case 2:
    foo = 6;
    break;
}

int foo;と の間case 0に注目してくださいcase 1。このステートメントは到達不可能です: プログラムをウォークスルーする場合、プログラムをステップオーバーすることはありません。

これはClangで警告やエラーなしでコンパイルされますが、実行するとジャッキアップしたように見えました(ただし、他の原因が原因である可能性があります).

到達不能ステートメントで変数を宣言し、それを到達可能ステートメントで使用することは明確に定義された動作ですか?それは機能しますか?

4

1 に答える 1

5

変数が自明な構造を持っている限り、これは明確に定義された動作であり、変数がより大きなスコープで宣言された場合と (ほぼ) 同じ効果があります。

初期化が必要な場合は、エラーが発生します。

セクション6.7は言う

ブロックに転送することは可能ですが、初期化で宣言をバイパスする方法ではできません。自動ストレージ期間を持つ変数がスコープ内にないポイントからスコープ内にあるポイントにジャンプするプログラムは、変数がスカラー型、単純なデフォルト コンストラクターと単純なデストラクタを持つクラス型を持たない限り、形式が正しくありません。これらの型のいずれかの cv 修飾バージョン、または上記の型のいずれかの配列であり、初期化子なしで宣言されています。

于 2013-04-06T18:50:51.473 に答える