C vs C++ switch语句变量定义vs声明

asi*_*mes 23 c c++

我正在玩一些语法,发现一些奇怪的编译器规则,想知道是什么原因

C不会编译这个,但C++会:

switch (argc) {
case 0:
    int foo;
    break;
default:
    break;
}
Run Code Online (Sandbox Code Playgroud)

C和C++都会编译这个:

switch (argc) {
case 0:
    ; int foo;
    break;
default:
    break;
}
Run Code Online (Sandbox Code Playgroud)

C将编译这个而不是C++:

switch (argc) {
case 0:
    ; int foo = 0;
    break;
default:
    break;
}
Run Code Online (Sandbox Code Playgroud)

gcc -vgcc version 4.9.3 (MacPorts gcc49 4.9.3_0)如果它很重要.我意识到解决方案是case 0:用大括号包装内容,但我对编译错误的推理更感兴趣

sep*_*p2k 23

case 0:
    int foo;
Run Code Online (Sandbox Code Playgroud)

在C和C++中,带标签的语句是一个标签,后跟一个语句.但是在C++中,语句的定义包括"块声明"(即可能出现在块中的声明和定义),而在C中则不包含(在C中,块是"块项"的序列,它们是块声明或语句 - 在C++中它是一系列语句,包括块声明).

case 0:
    ; int foo;
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为;在C和C++中都是一个(n空)语句,所以在这里我们确实有一个标签后跟一个语句.

case 0:
    ; int foo = 0;
Run Code Online (Sandbox Code Playgroud)

正如在评论中已经解释的那样,这在C++中不起作用,因为C++使跳过初始化成为非法.

  • @jaggedSpire,Assignment没有初始化.你可以很容易地做到这一点.FOO(ⅰ); i = 0;`没有跳过任何东西. (3认同)