asimes
asimes

Reputation: 5894

C vs C++ switch statement variable definition vs declaration

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

Answers (1)

sepp2k
sepp2k

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

Related Questions