“什么是……”&引用;C代码中的开关盒

“什么是……”&引用;C代码中的开关盒,c,gcc,gcc-extensions,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_DE

下面是
/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编程语言”没有提到它?

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

这是一个
gcc
,文档中对此进行了解释:

可以在单个大小写标签中指定连续值的范围,如下所示:

case low ... high:
你可以找到一个完整的列表。它似乎试图与
gcc
保持兼容。在
gcc
clang
中使用
-pedantic
标志将警告您这是非标准的,例如:

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

值得注意的是,本文中未涉及的扩展之一是语句表达式。

注意,它不是标准C,因此不可移植。这是为案件陈述设计的速记。它定义得很好,因为在C中只能打开整型

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

案例“0”…“7”:在gcc中

案例陈述的范围规范

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

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

也请阅读@GrijeshChauhan列出的dup的问题和答案与这个问题根本不匹配。此问题询问dup如何从该功能转换此功能。把它列为dup是愚蠢的。@ShafikYaghmour是吗?事实上,这里发布的答案是不同的。这个问题的答案很好(并被接受),我看不出有任何添加新问题的余地。我投票赞成重新开放。谢谢@ShafikYaghmour好的,我已经投票决定重新开放我们必须等到更多的用户投票决定重新开放OP或者你我必须升起旗帜重新开放。。。别无选择。回答不错,链接收集也很棒。谢谢涵盖语句表达式和Linux内核。