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

标签 c++ c

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

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

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

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

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

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

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

gcc -vgcc 版本 4.9.3 (MacPorts gcc49 4.9.3_0) 如果重要的话。我意识到解决方案是将 case 0: 的内容用大括号括起来,但我对编译错误的推理更感兴趣

最佳答案

case 0:
    int foo;

在 C 和 C++ 中,带标签的语句是一个标签后跟一个语句。然而,在 C++ 中,语句的定义包括“ block 声明”(即可能出现在 block 中的声明和定义),而在 C 中则不包括(在 C 中, block 是“ block 项”的序列,它们要么是 block 声明或语句 - 在 C++ 中,它是一系列语句,包括 block 声明)。

case 0:
    ; int foo;

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

case 0:
    ; int foo = 0;

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

关于c++ - C vs C++ switch 语句变量定义 vs 声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31553848/

相关文章:

c - 如何在 C 中嵌入 sqlite LIKE 命令?

java - 使用 JNA 访问包含 vector<char*> 的结构

c++ - 模板结构的大括号初始化

c++ - "C-style strings"是什么类型,它和 std::string 有什么关系

C scanf - 未知数组大小

c - putchar() 函数 : ambiguous output

c++ - 函数类型引用函数类型: undefined reference

c++ - bool 的 cin 意外行为

c - 在 C 中使用 fgets 读取文本文件直到 EOF

c++ - 将 C 与 C++ 链接是否可以避免在 C 中合法但在 C++ 中不合法的未定义行为?