我正在玩一些语法并发现一些奇怪的编译器规则,想知道这是什么原因
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 version 4.9.3 (MacPorts gcc49 4.9.3_0)
。我意识到解决方案是用大括号包装case 0:
的内容,但我对编译错误的推理更感兴趣
答案 0 :(得分:23)
case 0:
int foo;
在C和C ++中,带标签的语句是一个标签,后跟一个语句。但是在C ++中,语句的定义包括“块声明”(即可能出现在块中的声明和定义),而在C中则不包含(在C中,块是“块项”的序列,它们是块声明或语句 - 在C ++中,它是一系列语句,包括块声明。)
case 0:
; int foo;
这是有效的,因为;
在C和C ++中都是一个(n为空)语句,所以在这里我们确实有一个标签后跟一个语句。
case 0:
; int foo = 0;
正如在评论中已经解释的那样,这在C ++中不起作用,因为C ++使跳过初始化成为非法。