50

这是一段代码/usr/src/linux-3.10.10-1-ARCH/include/linux/printk.h

static inline int printk_get_level(const char *buffer)
{
  if (buffer[0] == KERN_SOH_ASCII && buffer[1]) {
    switch (buffer[1]) {
    case '0' ... '7':
    case 'd':  /* KERN_DEFAULT */
      return buffer[1];
    }
  }
}

它是一种运算符吗?为什么“The C Programming Language”没有提到它?

4

4 回答 4

65

这是一个gcc 名为 case range 的扩展,文档中是这样解释的:

您可以在单个 case 标签中指定一系列连续值,如下所示:

case low ... high:

您可以在此处找到 gcc 扩展的完整列表。似乎clang 也支持此尝试并与gcc. 在or中使用-pedantic标志会警告您这是非标准的,例如:gccclang

warning: range expressions in switch statements are non-standard [-Wpedantic]

有趣的是,Linux 内核使用了很多 gcc 扩展,本文未涉及的扩展之一是语句表达式。

于 2013-09-17T15:12:13.163 回答
12

它是 gcc 编译器扩展,允许在一行中组合多个 case 语句。

于 2013-09-17T15:11:49.507 回答
10

请注意,它不是标准 C,因此不可移植。它是为案例陈述设计的简写。它定义明确,因为在 C 中您只能打开整数类型。

在标准 C 中,...仅用于可变长度参数列表。

于 2013-09-17T15:12:39.330 回答
6

case '0'...'7': 是 gcc 中的case 范围规范

case 语句的范围规范。

在...周围写空格,否则当您将它与整数值一起使用时可能会解析错误

case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1]; 
于 2013-09-17T15:13:46.470 回答