C代码中的switch-case中的“...”是什么

时间:2013-09-17 15:10:14

标签: c gcc gcc-extensions

以下是/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];
    }
  }
}

它是一种运营商吗?为什么“C程序设计语言”没有提到它?

4 个答案:

答案 0 :(得分:62)

这是gcc extension called case ranges,这就是文档中解释的内容:

  

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

case low ... high:

您可以找到gcc extensions here的完整列表。尝试与gcc保持兼容似乎clang also supports this。使用-pedanticgcc中的clang标记会警告您这是非标准的,例如:

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

值得注意的是,Linux kernel uses a lot of gcc extensions本文未涉及的扩展之一是语句表达式。

答案 1 :(得分:12)

gcc编译器extension允许在一行中组合多个case语句。

答案 2 :(得分:10)

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

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

答案 3 :(得分:6)

case'0'...'7':gcc中为case ranges Speciacation

案例陈述的范围规范。

在...周围写入空格,否则在使用整数值时可能会解析错误

case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1];