我在玩一些语法,发现了一些奇怪的编译器规则,想知道这是什么原因
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 -v
是 gcc 版本 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/