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

jas*_*onz 49 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];
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

它是一种运营商吗?为什么"C编程语言"没有提到它?

Sha*_*our 62

这是一个gcc 称为案例范围扩展,这是在文档中解释的:

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

case low ... high:
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到完整的gcc扩展列表.似乎clang也支持这个尝试并保持兼容gcc.-pedantic在其中任何一个中使用该标志gccclang将警告您这是非标准的,例如:

warning: range expressions in switch statements are non-standard [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)

有趣的是,Linux内核使用了很多gcc扩展,其中一个扩展未在文章中提到,是语句表达式.

  • 很好的答案和很棒的链接收集.谢谢! (3认同)

Vla*_*mir 12

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


Bat*_*eba 10

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

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


Gan*_*har 6

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

案例陈述的范围规范.

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

case '0' or case '1' or case '3' and so on case '7':
or case 'b' :
just return buffer[1]; 
Run Code Online (Sandbox Code Playgroud)