c++ - 案例标签不需要空格?

标签 c++ c switch-statement

这可能是个愚蠢的问题,但有没有人知道 case 关键字和它在 switch 中的常量表达式之间是否有强制性空格声明?

标准似乎没有说什么......

考虑以下代码:

switch(int_expression)
{
    case1:     /*anything*/  // no space before 1
    caseZERO:  /*anything*/  // no space before ZERO
                             // ZERO being defined as 0
                             // by the pre-processor
}

我的两个引用编译器都接受此代码,并且一旦运行它就可以很好地工作。 预处理器如何识别必须替换为零?

另请注意,如果控制表达式是 char 类型而不是 int 类型,则也会编译以下内容,但这次不再有效

switch(char_expression)
{
    case'a':   /* anything */  // NO SPACES embedded
    caseZERO:  /* anything */  // NO SPACES again
                               // ZERO being defined as '0'
                               // by the pre-processor
}

此编译,但即使 char_expression 的值为“0” caseZERO 中没有语句被执行。

谁能解释一下?

最佳答案

这些是用于 goto 的通用标签并且实际上不会像您想要的那样匹配表达式。语法有效,但语义不同。

您没有指定这是 C 编译器还是 C++ 编译器,所以这里是 goto 的文档在 C 中也是如此。

此外,如果您查看附录 A.2.3 (6.8.1) 中 ISO C 标准提供的实际语法,则定义了一个 labeled-statement,如下所示:

(6.8.1) labeled-statement:

identifier : statement

case constant-expression : statement

default : statement

请特别注意,case 是一个单独的标记,在语法上下文中,它必须后跟至少一个标记分隔字符。 case1 示例中的数字不算作标记分隔符,因此您的示例属于语法的第一个分支,即 identifier not case 语句,因此不能用作 switch 语句的目标。

要回答有关在预处理器宏中定义 ZERO 的其他问题,您认为替换没有发生。同样,预处理器对标记进行操作,因此 caseZERO 是与 ZERO 宏不匹配的单个标记,因此根本不会被替换。同样,这只是使用 identifier 分支定义一个 labeled-statement,其中标识符是整个标记 caseZERO 而不是 case0case'0' 如您所愿。预处理器确实可以使用 ## 运算符进行“标记粘贴”,但这需要您使用 case ## ZERO。但是,这仍然不会产生您可能想要的行为。

关于c++ - 案例标签不需要空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748817/

相关文章:

c - 错误: "an array may not have elements of this type"

python - Python 中的 printf 格式 f 与 d

c++ - Qt 单个应用程序文件打开

c++ - 如何通过 Node 插件导出数组数据

c++ - Qt - 事物如何协同工作?

c - 对 C 函数的返回值进行类型转换是否可以接受?

java - 带堆栈的交换机路由(java语言)

java - 如何使用 String 和 Scanner 修复 Switch-case

java - 如何保存switch case中输入的数量?

c++ - cv::add 在 openCV 中不起作用