Подтвердить что ты не робот

C vs С++ определение переменной оператора switch vs declaration

Я играл с некоторым синтаксисом и обнаружил некоторые странные правила компиляции, задавался вопросом, что за аргумент для этого

C не будет компилировать это, но С++ будет:

switch (argc) {
case 0:
    int foo;
    break;
default:
    break;
}

Оба C и С++ скомпилируют этот:

switch (argc) {
case 0:
    ; int foo;
    break;
default:
    break;
}

C будет компилировать это, но не С++:

switch (argc) {
case 0:
    ; int foo = 0;
    break;
default:
    break;
}

gcc -v имеет значение gcc version 4.9.3 (MacPorts gcc49 4.9.3_0), если это имеет значение. Я понимаю, что решение состоит в том, чтобы обернуть содержимое case 0: фигурными скобками, но меня больше интересует аргументация ошибок компиляции

4b9b3361

Ответ 1

case 0:
    int foo;

В обоих языках C и С++ обозначение - это метка, за которой следует инструкция. Однако в С++ определение оператора включает в себя "объявления блока" (то есть объявления и определения, которые могут отображаться в блоке), тогда как в C это не так (в C блок представляет собой последовательность "элементов блока", которые являются либо блочными деклараций или утверждений - в С++ это последовательность операторов, которые включают объявления блоков).

case 0:
    ; int foo;

Это работает, потому что ; является (n пустым) оператором как в C, так и в С++, поэтому мы действительно имеем метку, за которой следует инструкция.

case 0:
    ; int foo = 0;

Как уже объяснялось в комментариях, это не работает в С++, потому что С++ делает незаконным перепрыгивать через инициализацию.