Ebomike's post has the answer to get rid of the errors. Now the reason is,
From Standard docs 6.7.3,
It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that
jumps77) from a point where a local variable with automatic storage duration is not in scope to a point where it is in
scope is ill-formed unless the variable has trivial type (3.9) and is declared without an initializer (8.5).
An example from the Standard docs itself,
void f()
{
// ...
goto lx; // ill-formed: jump into scope of a
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}
In which the statement goto lx;
is ill-formed because it is being jumped to the statement lx
, where the scope of a
is visible.
Also,
77)The transfer from the condition of a switch statement to a case label is considered a jump in this respect.
So, this applies to switch
as well.
And if braces {}
are put in them, the scope is limited to the braces and you are free to declare within each case
statement.
Hope that helps..