繁体   English   中英

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

[英]C vs C++ switch statement variable definition vs declaration

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

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 version 4.9.3 (MacPorts gcc49 4.9.3_0) 我意识到解决方案是用大括号包装case 0:的内容case 0:但我对编译错误的推理更感兴趣

case 0:
    int foo;

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

case 0:
    ; int foo;

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

case 0:
    ; int foo = 0;

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM