这可能是个愚蠢的问题,但有没有人知道 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
而不是 case0
或 case'0'
如您所愿。预处理器确实可以使用 ##
运算符进行“标记粘贴”,但这需要您使用 case ## ZERO
。但是,这仍然不会产生您可能想要的行为。
关于c++ - 案例标签不需要空格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28748817/