Reputation: 5894
I was playing with some syntax and found some strange compiler rules, was wondering what the reasoning is for this
C will not compile this but C++ will:
switch (argc) {
case 0:
int foo;
break;
default:
break;
}
Both C and C++ will compile this:
switch (argc) {
case 0:
; int foo;
break;
default:
break;
}
C will compile this but not C++:
switch (argc) {
case 0:
; int foo = 0;
break;
default:
break;
}
gcc -v
is gcc version 4.9.3 (MacPorts gcc49 4.9.3_0)
if it matters. I realize the solution is to wrap the contents of case 0:
with curly brackets, but I am more interested in the reasoning for compilation errors
Upvotes: 23
Views: 1468
Reputation: 370262
case 0:
int foo;
In both C and C++ a labeled statement is a label followed by a statement. However in C++ the definition of a statement includes "block declarations" (that is declarations and definitions that may appear in a block) whereas in C it does not (in C a block is a sequence of "block items", which are either block declarations or statements - in C++ it's a sequence of statements, which include block declarations).
case 0:
; int foo;
This works because ;
is a(n empty) statement in both C and C++, so here we indeed have a label followed by a statement.
case 0:
; int foo = 0;
As was already explained in the comments, this does not work in C++ because C++ makes it illegal to jump over an initialization.
Upvotes: 23