【问题标题】:What is "..." in switch-case in C codeC代码中switch-case中的“...”是什么
【发布时间】:2013-09-22 02:34:28
【问题描述】:

这是/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》没有提及?

【问题讨论】:

  • @GrijeshChauhan 列出的 dup 的问题和答案甚至与这个问题不匹配。此问题询问此功能是什么,dup 询问如何从此功能转换。将其列为 dup 是愚蠢的。
  • @ShafikYaghmour 是吗?事实上,这里发布的答案是不同的。通过问题得到很好的回答(并被接受),我看不到任何可以添加新问题的范围......我投票支持重新开放。谢谢!
  • @ShafikYaghmour 好的,我已投票重新开放,我们必须等到更多用户投票重新开放 OP,否则您或我必须升旗才能重新开放......别无选择。

标签: c gcc gcc-extensions


【解决方案1】:

这是一个gccextension called case ranges,文档中是这样解释的:

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

case low ... high:

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

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

有趣的是,Linux kernel uses a lot of gcc extensions 文章中未涉及的扩展之一是语句表达式。

【讨论】:

  • 很好的答案和很棒的链接集合。谢谢!
  • FAQ/DoWhile0 涵盖语句表达式和 Linux 内核。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      case '0'...'7': 在 gcc 中是 case ranges Speciacation

      case 语句的范围规范。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多